]> granicus.if.org Git - sudo/commitdiff
In fill_args() clean up properly if there is an internal overflow
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 7 May 2016 10:37:55 +0000 (04:37 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 7 May 2016 10:37:55 +0000 (04:37 -0600)
(which should not be possible).  Coverity CID 104569.

plugins/sudoers/toke_util.c

index 01b4fe1106ff41e8f9c556412b7b75bbcb6882ff..e7bc37f01adc0cd41710c5be2cf0613c4724f76b 100644 (file)
@@ -144,11 +144,7 @@ fill_args(const char *s, size_t len, int addspace)
        p = realloc(sudoerslval.command.args, arg_size);
        if (p == NULL) {
            sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
-           sudoerserror(NULL);
-           free(sudoerslval.command.args);
-           sudoerslval.command.args = NULL;
-           arg_len = arg_size = 0;
-           debug_return_bool(false);
+           goto bad;
        } else
            sudoerslval.command.args = p;
     }
@@ -159,11 +155,16 @@ fill_args(const char *s, size_t len, int addspace)
        *p++ = ' ';
     if (strlcpy(p, s, arg_size - (p - sudoerslval.command.args)) != (size_t)len) {
        sudo_warnx(U_("internal error, %s overflow"), __func__);
-       sudoerserror(NULL);
-       debug_return_bool(false);
+       goto bad;
     }
     arg_len = new_len;
     debug_return_bool(true);
+bad:
+    sudoerserror(NULL);
+    free(sudoerslval.command.args);
+    sudoerslval.command.args = NULL;
+    arg_len = arg_size = 0;
+    debug_return_bool(false);
 }
 
 /*