perf help: Do not use ALLOC_GROW in add_cmd_list
authorMasami Hiramatsu <mhiramat@kernel.org>
Tue, 10 May 2016 05:47:53 +0000 (14:47 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 10 May 2016 14:58:09 +0000 (11:58 -0300)
Replace ALLOC_GROW with normal realloc code in add_cmd_list() so that it
can handle errors directly.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20160510054752.6158.30562.stgit@devbox
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/help-unknown-cmd.c

index 43a98a4dc1e1e90c7079fba26929022ec0959a31..d62ccaeeadd6e71586479e6d6dc4d84fe7f716f4 100644 (file)
@@ -27,16 +27,27 @@ static int levenshtein_compare(const void *p1, const void *p2)
        return l1 != l2 ? l1 - l2 : strcmp(s1, s2);
 }
 
-static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old)
+static int add_cmd_list(struct cmdnames *cmds, struct cmdnames *old)
 {
-       unsigned int i;
-
-       ALLOC_GROW(cmds->names, cmds->cnt + old->cnt, cmds->alloc);
-
+       unsigned int i, nr = cmds->cnt + old->cnt;
+       void *tmp;
+
+       if (nr > cmds->alloc) {
+               /* Choose bigger one to alloc */
+               if (alloc_nr(cmds->alloc) < nr)
+                       cmds->alloc = nr;
+               else
+                       cmds->alloc = alloc_nr(cmds->alloc);
+               tmp = realloc(cmds->names, cmds->alloc * sizeof(*cmds->names));
+               if (!tmp)
+                       return -1;
+               cmds->names = tmp;
+       }
        for (i = 0; i < old->cnt; i++)
                cmds->names[cmds->cnt++] = old->names[i];
        zfree(&old->names);
        old->cnt = 0;
+       return 0;
 }
 
 const char *help_unknown_cmd(const char *cmd)
@@ -52,8 +63,11 @@ const char *help_unknown_cmd(const char *cmd)
 
        load_command_list("perf-", &main_cmds, &other_cmds);
 
-       add_cmd_list(&main_cmds, &aliases);
-       add_cmd_list(&main_cmds, &other_cmds);
+       if (add_cmd_list(&main_cmds, &aliases) < 0 ||
+           add_cmd_list(&main_cmds, &other_cmds) < 0) {
+               fprintf(stderr, "ERROR: Failed to allocate command list for unknown command.\n");
+               goto end;
+       }
        qsort(main_cmds.names, main_cmds.cnt,
              sizeof(main_cmds.names), cmdname_compare);
        uniq(&main_cmds);
@@ -99,6 +113,6 @@ const char *help_unknown_cmd(const char *cmd)
                for (i = 0; i < n; i++)
                        fprintf(stderr, "\t%s\n", main_cmds.names[i]->name);
        }
-
+end:
        exit(1);
 }