From 6e1e43ff3bdfe33811d387c33db5f73edf4a1675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Sandmann=20Pedersen?= Date: Tue, 8 Sep 2009 01:26:29 -0400 Subject: [PATCH] Make sure parser->symbols is non-NULL after read_table() Otherwise, we would read the file over and over. Also get the process name from /proc/pid/cmdline, falling back to /proc/pid/status if there is nothing there. --- elfparser.c | 13 +++++++++++-- tracker.c | 36 ++++++++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/elfparser.c b/elfparser.c index e543a401..e13cfcac 100644 --- a/elfparser.c +++ b/elfparser.c @@ -432,6 +432,10 @@ read_table (ElfParser *parser, { int sym_size = bin_record_get_size (parser->sym_format); int i, n_symbols; + +#if 0 + g_print ("elf: Reading table for %s\n", parser->filename? parser->filename : ""); +#endif parser->n_symbols = sym_table->size / sym_size; parser->symbols = g_new (ElfSym, parser->n_symbols); @@ -505,7 +509,12 @@ read_table (ElfParser *parser, parser->sym_strings = str_table->offset; parser->n_symbols = n_symbols; - parser->symbols = g_renew (ElfSym, parser->symbols, parser->n_symbols); + + /* Allocate space for at least one symbol, so that parser->symbols will be + * non-NULL. If it ends up being NULL, we will be parsing the file over and + * over. + */ + parser->symbols = g_renew (ElfSym, parser->symbols, parser->n_symbols + 1); qsort (parser->symbols, parser->n_symbols, sizeof (ElfSym), compare_sym); } @@ -583,7 +592,7 @@ elf_parser_lookup_symbol (ElfParser *parser, if (!parser->symbols) { #if 0 - g_print ("reading symbols\n"); + g_print ("reading symbols at %p\n", parser); #endif read_symbols (parser); } diff --git a/tracker.c b/tracker.c index b3e0f75c..f89abcf8 100644 --- a/tracker.c +++ b/tracker.c @@ -80,23 +80,39 @@ static void fake_new_process (tracker_t *tracker, pid_t pid) { char **lines; + gboolean done = FALSE; - if ((lines = get_lines ("/proc/%d/status", pid))) + if ((lines = get_lines ("/proc/%d/cmdline", pid))) + { + if (lines[0] && strlen (lines[0]) > 0) + { + tracker_add_process (tracker, pid, lines[0]); + done = TRUE; + } + + g_strfreev (lines); + } + + if (!done && (lines = get_lines ("/proc/%d/status", pid))) { int i; - + for (i = 0; lines[i] != NULL; ++i) { if (strncmp ("Name:", lines[i], 5) == 0) { - tracker_add_process ( - tracker, pid, g_strstrip (strchr (lines[i], ':') + 1)); - - break; - } - } - - g_strfreev (lines); + char *name = g_strstrip (strchr (lines[i], ':') + 1); + + if (strlen (name) > 0) + { + tracker_add_process (tracker, pid, name); + done = TRUE; + break; + } + } + } + + g_strfreev (lines); } }