Whamcloud - gitweb
libss: fix memory leak if realloc() fails in ss_parse()
authorTheodore Ts'o <tytso@mit.edu>
Tue, 7 Jan 2014 14:36:49 +0000 (09:36 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 9 Jan 2014 00:46:05 +0000 (19:46 -0500)
Addresses-Coverity-Id: #709491

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
lib/ss/parse.c

index e2928e2..45a2de0 100644 (file)
@@ -45,7 +45,7 @@ enum parse_mode { WHITESPACE, TOKEN, QUOTED_STRING };
 
 char **ss_parse(int sci_idx, register char *line_ptr, int *argc_ptr)
 {
-    register char **argv, *cp;
+    register char **argv, **new_argv, *cp;
     register int argc;
     register enum parse_mode parse_mode;
 
@@ -78,7 +78,13 @@ char **ss_parse(int sci_idx, register char *line_ptr, int *argc_ptr)
                /* go to quoted-string mode */
                parse_mode = QUOTED_STRING;
                cp = line_ptr++;
-               argv = NEW_ARGV (argv, argc);
+               new_argv = NEW_ARGV (argv, argc);
+               if (new_argv == NULL) {
+                       free(argv);
+                       *argc_ptr = 0;
+                       return NULL;
+               }
+               argv = new_argv;
                argv[argc++] = cp;
                argv[argc] = NULL;
            }
@@ -86,11 +92,13 @@ char **ss_parse(int sci_idx, register char *line_ptr, int *argc_ptr)
                /* random-token mode */
                parse_mode = TOKEN;
                cp = line_ptr;
-               argv = NEW_ARGV (argv, argc);
+               new_argv = NEW_ARGV (argv, argc);
                if (argv == NULL) {
-                       *argc_ptr = errno;
-                       return argv;
+                       free(argv);
+                       *argc_ptr = 0;
+                       return NULL;
                }
+               argv = new_argv;
                argv[argc++] = line_ptr;
                argv[argc] = NULL;
            }