cmd: bail if out of memory while printing syntax 35/13335/6
authorPat Riehecky <riehecky@fnal.gov>
Fri, 21 Sep 2018 15:05:24 +0000 (10:05 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Tue, 12 Feb 2019 00:32:59 +0000 (19:32 -0500)
Bail with an error message to stderr if we are unable to format the
command syntax due to a string allocation error.

Found via scan-build.

[mmeffie: updated commit]

Change-Id: Ib3bc7f53c295d8dde6c07b9c4990cd1b3bcee58c
Reviewed-on: https://gerrit.openafs.org/13335
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/cmd/cmd.c

index ffe49aa..10b2b1b 100644 (file)
@@ -176,7 +176,7 @@ ParmHelpString(struct cmd_parmdesc *aparm)
                     aparm->help?aparm->help:"arg",
                     aparm->type == CMD_LIST?"+":"",
                     aparm->type == CMD_SINGLE_OR_FLAG?"]":"") < 0)
-           return "<< OUT OF MEMORY >>";
+           return NULL;
        return str;
     }
 }
@@ -220,6 +220,10 @@ PrintSyntax(struct cmd_syndesc *as)
        /* The parameter name is the real name, plus any aliases */
        if (!tp->aliases) {
            name = strdup(tp->name);
+           if (!name) {
+               fprintf(stderr, "Out of memory.\n");
+               return;
+           }
        } else {
            size_t namelen;
            struct cmd_item *alias;
@@ -228,6 +232,10 @@ PrintSyntax(struct cmd_syndesc *as)
                namelen+=strlen(alias->data) + 3;
 
            name = malloc(namelen);
+           if (!name) {
+               fprintf(stderr, "Out of memory.\n");
+               return;
+           }
            strlcpy(name, tp->name, namelen);
 
            for (alias = tp->aliases; alias != NULL; alias = alias->next) {
@@ -239,6 +247,11 @@ PrintSyntax(struct cmd_syndesc *as)
        /* Work out if we can fit what we want to on this line, or if we need to
         * start a new one */
        str = ParmHelpString(tp);
+       if (!str) {
+           fprintf(stderr, "Out of memory.\n");
+           free(name);
+           return;
+       }
        xtralen = 1 + strlen(name) + strlen(str) +
                  ((tp->flags & CMD_OPTIONAL)? 2: 0);