summaryrefslogtreecommitdiffstats
path: root/src/osx
diff options
context:
space:
mode:
authoraristocratos <admin@qvantnet.com>2021-11-13 20:51:06 +0100
committeraristocratos <admin@qvantnet.com>2021-11-13 20:51:06 +0100
commitdc5f0606cbe6f4d61bec3621c25190f1241b3fce (patch)
treeefe602fc42210386118121f30fcebb286309adf8 /src/osx
parent8b59ab6e1120439a070b07a4255b10bd7d5197cf (diff)
Fixed leak in Proc::collect()
Diffstat (limited to 'src/osx')
-rw-r--r--src/osx/btop_collect.cpp14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/osx/btop_collect.cpp b/src/osx/btop_collect.cpp
index 5979c8d..ac9fb22 100644
--- a/src/osx/btop_collect.cpp
+++ b/src/osx/btop_collect.cpp
@@ -1119,7 +1119,7 @@ namespace Proc {
//? Process runtime : current time - start time (both in unix time - seconds since epoch)
struct timeval currentTime;
gettimeofday(&currentTime, NULL);
- detailed.elapsed = sec_to_dhms(currentTime.tv_sec - detailed.entry.cpu_s); // only interested in second granularity, so ignoring tc_usec
+ detailed.elapsed = sec_to_dhms(currentTime.tv_sec - (detailed.entry.cpu_s / 1'000'000));
if (detailed.elapsed.size() > 8) detailed.elapsed.resize(detailed.elapsed.size() - 3);
//? Get parent process name
@@ -1234,18 +1234,18 @@ namespace Proc {
new_proc.name = f_name.substr(lastSlash + 1);
//? Get process arguments if possible, fallback to process path in case of failure
if (Shared::arg_max > 0) {
- string proc_args;
- proc_args.resize(Shared::arg_max);
+ std::unique_ptr<char[]> proc_chars(new char[Shared::arg_max]);
int mib[] = {CTL_KERN, KERN_PROCARGS2, (int)pid};
size_t argmax = Shared::arg_max;
- if (sysctl(mib, 3, proc_args.data(), &argmax, NULL, 0) == 0) {
- int argc;
- memcpy(&argc, &proc_args[0], sizeof(argc));
+ if (sysctl(mib, 3, proc_chars.get(), &argmax, NULL, 0) == 0) {
+ int argc = 0;
+ memcpy(&argc, &proc_chars.get()[0], sizeof(argc));
+ std::string_view proc_args(proc_chars.get(), argmax);
if (size_t null_pos = proc_args.find('\0', sizeof(argc)); null_pos != string::npos) {
if (size_t start_pos = proc_args.find_first_not_of('\0', null_pos); start_pos != string::npos) {
while (argc-- > 0 and null_pos != string::npos) {
null_pos = proc_args.find('\0', start_pos);
- new_proc.cmd += proc_args.substr(start_pos, null_pos - start_pos) + ' ';
+ new_proc.cmd += (string)proc_args.substr(start_pos, null_pos - start_pos) + ' ';
start_pos = null_pos + 1;
}
}