Make sure parser->symbols is non-NULL after read_table()
authorSøren Sandmann Pedersen <ssp@redhat.com>
Tue, 8 Sep 2009 05:26:29 +0000 (01:26 -0400)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Tue, 8 Sep 2009 07:03:23 +0000 (03:03 -0400)
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
tracker.c

index e543a40..e13cfca 100644 (file)
@@ -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 : "<unknown>");
+#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);
     }
index b3e0f75..f89abcf 100644 (file)
--- 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);
     }
 }