aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung.kim@lge.com>2012-04-08 22:54:33 -0400
committerNamhyung Kim <namhyung@kernel.org>2012-07-04 00:40:31 -0400
commitd286447f23cdb0337a5429e10b39761f6b1d5c18 (patch)
tree8a7178790f2bc045796a51a50f60a15aeb3e5d70 /tools
parentca63858e9eb0ce495031c4ab5291874835cb43cf (diff)
tools lib traceevent: Handle realloc() failure path
The realloc can fail so that we should handle it properly. Signed-off-by: Namhyung Kim <namhyung.kim@lge.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@infradead.org> Cc: Borislav Petkov <bp@alien8.de> Cc: David Ahern <dsahern@gmail.com> Link: http://lkml.kernel.org/r/1333940074-19052-7-git-send-email-namhyung.kim@lge.com Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/lib/traceevent/event-parse.c76
1 files changed, 60 insertions, 16 deletions
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index cd334d52d333..05eb6b40b16a 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -1264,9 +1264,15 @@ static int event_read_fields(struct event_format *event, struct format_field **f
1264 field->flags |= FIELD_IS_POINTER; 1264 field->flags |= FIELD_IS_POINTER;
1265 1265
1266 if (field->type) { 1266 if (field->type) {
1267 field->type = realloc(field->type, 1267 char *new_type;
1268 strlen(field->type) + 1268 new_type = realloc(field->type,
1269 strlen(last_token) + 2); 1269 strlen(field->type) +
1270 strlen(last_token) + 2);
1271 if (!new_type) {
1272 free(last_token);
1273 goto fail;
1274 }
1275 field->type = new_type;
1270 strcat(field->type, " "); 1276 strcat(field->type, " ");
1271 strcat(field->type, last_token); 1277 strcat(field->type, last_token);
1272 free(last_token); 1278 free(last_token);
@@ -1291,6 +1297,7 @@ static int event_read_fields(struct event_format *event, struct format_field **f
1291 if (strcmp(token, "[") == 0) { 1297 if (strcmp(token, "[") == 0) {
1292 enum event_type last_type = type; 1298 enum event_type last_type = type;
1293 char *brackets = token; 1299 char *brackets = token;
1300 char *new_brackets;
1294 int len; 1301 int len;
1295 1302
1296 field->flags |= FIELD_IS_ARRAY; 1303 field->flags |= FIELD_IS_ARRAY;
@@ -1310,9 +1317,14 @@ static int event_read_fields(struct event_format *event, struct format_field **f
1310 len = 1; 1317 len = 1;
1311 last_type = type; 1318 last_type = type;
1312 1319
1313 brackets = realloc(brackets, 1320 new_brackets = realloc(brackets,
1314 strlen(brackets) + 1321 strlen(brackets) +
1315 strlen(token) + len); 1322 strlen(token) + len);
1323 if (!new_brackets) {
1324 free(brackets);
1325 goto fail;
1326 }
1327 brackets = new_brackets;
1316 if (len == 2) 1328 if (len == 2)
1317 strcat(brackets, " "); 1329 strcat(brackets, " ");
1318 strcat(brackets, token); 1330 strcat(brackets, token);
@@ -1328,7 +1340,12 @@ static int event_read_fields(struct event_format *event, struct format_field **f
1328 1340
1329 free_token(token); 1341 free_token(token);
1330 1342
1331 brackets = realloc(brackets, strlen(brackets) + 2); 1343 new_brackets = realloc(brackets, strlen(brackets) + 2);
1344 if (!new_brackets) {
1345 free(brackets);
1346 goto fail;
1347 }
1348 brackets = new_brackets;
1332 strcat(brackets, "]"); 1349 strcat(brackets, "]");
1333 1350
1334 /* add brackets to type */ 1351 /* add brackets to type */
@@ -1339,10 +1356,16 @@ static int event_read_fields(struct event_format *event, struct format_field **f
1339 * the format: type [] item; 1356 * the format: type [] item;
1340 */ 1357 */
1341 if (type == EVENT_ITEM) { 1358 if (type == EVENT_ITEM) {
1342 field->type = realloc(field->type, 1359 char *new_type;
1343 strlen(field->type) + 1360 new_type = realloc(field->type,
1344 strlen(field->name) + 1361 strlen(field->type) +
1345 strlen(brackets) + 2); 1362 strlen(field->name) +
1363 strlen(brackets) + 2);
1364 if (!new_type) {
1365 free(brackets);
1366 goto fail;
1367 }
1368 field->type = new_type;
1346 strcat(field->type, " "); 1369 strcat(field->type, " ");
1347 strcat(field->type, field->name); 1370 strcat(field->type, field->name);
1348 free_token(field->name); 1371 free_token(field->name);
@@ -1350,9 +1373,15 @@ static int event_read_fields(struct event_format *event, struct format_field **f
1350 field->name = token; 1373 field->name = token;
1351 type = read_token(&token); 1374 type = read_token(&token);
1352 } else { 1375 } else {
1353 field->type = realloc(field->type, 1376 char *new_type;
1354 strlen(field->type) + 1377 new_type = realloc(field->type,
1355 strlen(brackets) + 1); 1378 strlen(field->type) +
1379 strlen(brackets) + 1);
1380 if (!new_type) {
1381 free(brackets);
1382 goto fail;
1383 }
1384 field->type = new_type;
1356 strcat(field->type, brackets); 1385 strcat(field->type, brackets);
1357 } 1386 }
1358 free(brackets); 1387 free(brackets);
@@ -1735,10 +1764,16 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok)
1735 /* could just be a type pointer */ 1764 /* could just be a type pointer */
1736 if ((strcmp(arg->op.op, "*") == 0) && 1765 if ((strcmp(arg->op.op, "*") == 0) &&
1737 type == EVENT_DELIM && (strcmp(token, ")") == 0)) { 1766 type == EVENT_DELIM && (strcmp(token, ")") == 0)) {
1767 char *new_atom;
1768
1738 if (left->type != PRINT_ATOM) 1769 if (left->type != PRINT_ATOM)
1739 die("bad pointer type"); 1770 die("bad pointer type");
1740 left->atom.atom = realloc(left->atom.atom, 1771 new_atom = realloc(left->atom.atom,
1741 strlen(left->atom.atom) + 3); 1772 strlen(left->atom.atom) + 3);
1773 if (!new_atom)
1774 goto out_free;
1775
1776 left->atom.atom = new_atom;
1742 strcat(left->atom.atom, " *"); 1777 strcat(left->atom.atom, " *");
1743 free(arg->op.op); 1778 free(arg->op.op);
1744 *arg = *left; 1779 *arg = *left;
@@ -2597,7 +2632,16 @@ process_arg_token(struct event_format *event, struct print_arg *arg,
2597 } 2632 }
2598 /* atoms can be more than one token long */ 2633 /* atoms can be more than one token long */
2599 while (type == EVENT_ITEM) { 2634 while (type == EVENT_ITEM) {
2600 atom = realloc(atom, strlen(atom) + strlen(token) + 2); 2635 char *new_atom;
2636 new_atom = realloc(atom,
2637 strlen(atom) + strlen(token) + 2);
2638 if (!new_atom) {
2639 free(atom);
2640 *tok = NULL;
2641 free_token(token);
2642 return EVENT_ERROR;
2643 }
2644 atom = new_atom;
2601 strcat(atom, " "); 2645 strcat(atom, " ");
2602 strcat(atom, token); 2646 strcat(atom, token);
2603 free_token(token); 2647 free_token(token);