diff --git a/src/blackjack/main.c b/src/blackjack/main.c index d6e4873..ff25cde 100644 --- a/src/blackjack/main.c +++ b/src/blackjack/main.c @@ -25,7 +25,7 @@ void print_status(procstat_status_t* proc) int main(int argc, char** argv) { - // test test + // map test { procstat_map_t* maps; size_t map_count; @@ -64,14 +64,14 @@ int main(int argc, char** argv) if (procstat_get_threads(parent->pid, &threads, &thread_count)) { fputs("failed to obtain process threads\n", stderr); - free(list); + procstat_free_status_list(list, count); return 1; } if (procstat_find_active(threads, thread_count, &active)) { // no active threads - free list and continue - free(threads); + procstat_free_status_list(threads, thread_count); usleep(500*1000); } else @@ -96,8 +96,8 @@ int main(int argc, char** argv) { fprintf(stderr, "failed to attach: %s\n", strerror(errno)); - free(threads); - free(list); + procstat_free_status_list(threads, thread_count); + procstat_free_status_list(list, count); return 1; } @@ -116,8 +116,8 @@ int main(int argc, char** argv) process_detach_all(threads, thread_count); - free(threads); - free(list); + procstat_free_status_list(threads, thread_count); + procstat_free_status_list(list, count); return 0; } \ No newline at end of file diff --git a/src/blackjack/procstat.c b/src/blackjack/procstat.c index 46ba274..8c746ab 100644 --- a/src/blackjack/procstat.c +++ b/src/blackjack/procstat.c @@ -25,6 +25,8 @@ int procstat_parse_status(pid_t pid, procstat_status_t* status) if (rd < 1) return 1; + memset(status, '\0', sizeof(procstat_status_t)); + char* lineptr = NULL, *line = strtok_r(buffer, "\n", &lineptr); while (line != NULL) { @@ -33,7 +35,9 @@ int procstat_parse_status(pid_t pid, procstat_status_t* status) const char* value = (const char*)strtok_r(NULL, ":\t", &fieldptr); if (!strcmp(key, "Name")) - strncpy(status->name, value, MAX_PROCESS_NAME); + { + if (value) status->name = strdup(value); + } else if (!strcmp(key, "Umask")) status->umask = (unsigned int)strtoul(value, NULL, 8); else if (!strcmp(key, "State")) @@ -59,6 +63,13 @@ int procstat_parse_status(pid_t pid, procstat_status_t* status) return 0; } +void procstat_free_status_list(procstat_status_t* list, size_t count) +{ + for (unsigned i = 0; i < count; i++) + if (list[i].name) free(list[i].name); + free(list); +} + static int is_numeric(const char* str) { for (const char* p = str; *p; p++) @@ -310,7 +321,7 @@ int procstat_parse_maps(pid_t pid, procstat_map_t** maps, size_t* count) // path if (pathname) map->path = strdup(pathname); - TRACE("map v_start %lx v_end %lx prot %x flags %x f_offset %x dev_major %u dev_minor %u inode %lu path %s\n", + TRACE("map v_start %lx v_end %lx prot %x flags %x f_offset %lx dev_major %u dev_minor %u inode %lu path %s\n", map->v_start, map->v_end, map->prot, map->flags, map->f_offset, diff --git a/src/blackjack/procstat.h b/src/blackjack/procstat.h index 4271e93..4cbc368 100644 --- a/src/blackjack/procstat.h +++ b/src/blackjack/procstat.h @@ -15,9 +15,8 @@ typedef enum { ZOMBIE = 'Z' } procstat_state_t; -#define MAX_PROCESS_NAME 256 typedef struct { - char name[MAX_PROCESS_NAME]; + char* name; mode_t umask; procstat_state_t state; pid_t tgid; @@ -33,6 +32,9 @@ typedef struct { // error information obtain from errno int procstat_parse_status(pid_t pid, procstat_status_t* status); +// free all procstat status list entries +void procstat_free_status_list(procstat_status_t* list, size_t count); + // find any process that matches name, case insensitive. // list pointer must point to NULL-initialized pointer, and count pointer must pount to initialized 0 // will skip any process which status couldn't be parsed