aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2011-01-19 15:50:03 -0500
committerSteven Rostedt <rostedt@goodmis.org>2011-01-19 15:50:03 -0500
commite2d243799e10c70d4e6ffc25cd9578f62f06b492 (patch)
tree144b472aef57613a278cb2bc1494078d39c24ea9
parentc3245cde227ca64180dcad8ec43008a77d5f3713 (diff)
parse-events: Always allocate comm for pevent_register_comm()
The function pevent_register_comm() will allocate its own comm depending on when you execute it. This is stupid and likely to cause bugs. Make it always allocate its own comm and also change the parameter name to accept const char *. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--parse-events.c14
-rw-r--r--parse-events.h2
-rw-r--r--trace-graph.c2
3 files changed, 13 insertions, 5 deletions
diff --git a/parse-events.c b/parse-events.c
index a959ebc..beab8f3 100644
--- a/parse-events.c
+++ b/parse-events.c
@@ -225,8 +225,13 @@ static int add_new_comm(struct pevent *pevent, char *comm, int pid)
225 const struct cmdline *cmdline; 225 const struct cmdline *cmdline;
226 struct cmdline key; 226 struct cmdline key;
227 227
228 if (!pid) 228 if (!comm)
229 die("malloc comm");
230
231 if (!pid) {
232 free(comm);
229 return 0; 233 return 0;
234 }
230 235
231 /* avoid duplicates */ 236 /* avoid duplicates */
232 key.pid = pid; 237 key.pid = pid;
@@ -246,6 +251,7 @@ static int add_new_comm(struct pevent *pevent, char *comm, int pid)
246 251
247 cmdlines[pevent->cmdline_count].pid = pid; 252 cmdlines[pevent->cmdline_count].pid = pid;
248 cmdlines[pevent->cmdline_count].comm = comm; 253 cmdlines[pevent->cmdline_count].comm = comm;
254 if (cmdlines[pevent->cmdline_count].comm)
249 pevent->cmdline_count++; 255 pevent->cmdline_count++;
250 256
251 qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp); 257 qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
@@ -263,15 +269,17 @@ static int add_new_comm(struct pevent *pevent, char *comm, int pid)
263 * This adds a mapping to search for command line names with 269 * This adds a mapping to search for command line names with
264 * a given pid. The comm is duplicated. 270 * a given pid. The comm is duplicated.
265 */ 271 */
266int pevent_register_comm(struct pevent *pevent, char *comm, int pid) 272int pevent_register_comm(struct pevent *pevent, const char *comm, int pid)
267{ 273{
268 struct cmdline_list *item; 274 struct cmdline_list *item;
269 275
270 if (pevent->cmdlines) 276 if (pevent->cmdlines)
271 return add_new_comm(pevent, comm, pid); 277 return add_new_comm(pevent, strdup(comm), pid);
272 278
273 item = malloc_or_die(sizeof(*item)); 279 item = malloc_or_die(sizeof(*item));
274 item->comm = strdup(comm); 280 item->comm = strdup(comm);
281 if (!item->comm)
282 die("malloc comm");
275 item->pid = pid; 283 item->pid = pid;
276 item->next = pevent->cmdlist; 284 item->next = pevent->cmdlist;
277 285
diff --git a/parse-events.h b/parse-events.h
index 38ddf95..4732acf 100644
--- a/parse-events.h
+++ b/parse-events.h
@@ -428,7 +428,7 @@ enum trace_flag_type {
428 TRACE_FLAG_SOFTIRQ = 0x10, 428 TRACE_FLAG_SOFTIRQ = 0x10,
429}; 429};
430 430
431int pevent_register_comm(struct pevent *pevent, char *comm, int pid); 431int pevent_register_comm(struct pevent *pevent, const char *comm, int pid);
432int pevent_register_function(struct pevent *pevent, char *name, 432int pevent_register_function(struct pevent *pevent, char *name,
433 unsigned long long addr, char *mod); 433 unsigned long long addr, char *mod);
434int pevent_register_print_string(struct pevent *pevent, char *fmt, 434int pevent_register_print_string(struct pevent *pevent, char *fmt,
diff --git a/trace-graph.c b/trace-graph.c
index 7225880..2ddd283 100644
--- a/trace-graph.c
+++ b/trace-graph.c
@@ -1134,7 +1134,7 @@ int trace_graph_check_sched_switch(struct graph_info *ginfo,
1134 */ 1134 */
1135 if (!pevent_pid_is_registered(ginfo->pevent, *pid)) 1135 if (!pevent_pid_is_registered(ginfo->pevent, *pid))
1136 pevent_register_comm(ginfo->pevent, 1136 pevent_register_comm(ginfo->pevent,
1137 strdup(*comm), *pid); 1137 *comm, *pid);
1138 } 1138 }
1139 1139
1140 return ret; 1140 return ret;