]> granicus.if.org Git - sudo/commitdiff
Simplify "sudo -s" argv rewriting.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 14 Jun 2012 20:17:15 +0000 (16:17 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 14 Jun 2012 20:17:15 +0000 (16:17 -0400)
src/parse_args.c

index bcdfd862f6de4a69587b0c9c6fd999655ad1fc3f..1ee85a25bbf97a12a48785f7a6eb3f53e8fc9e35 100644 (file)
@@ -378,17 +378,12 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp,
      * For shell mode we need to rewrite argv
      */
     if (ISSET(mode, MODE_RUN) && ISSET(flags, MODE_SHELL)) {
-       char **av;
-       int ac;
-
-       if (argc == 0) {
-           /* just the shell */
-           ac = argc + 1;
-           av = emalloc2(ac + 1, sizeof(char *));
-           memcpy(av + 1, argv, argc * sizeof(char *));
-       } else {
+       char **av, *cmnd = NULL;
+       int ac = 1;
+
+       if (argc != 0) {
            /* shell -c "command" */
-           char *cmnd, *src, *dst;
+           char *src, *dst;
            size_t cmnd_size = (size_t) (argv[argc - 1] - argv[0]) +
                strlen(argv[argc - 1]) + 1;
 
@@ -406,12 +401,15 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp,
                dst--;  /* replace last space with a NUL */
            *dst = '\0';
 
-           ac = 3;
-           av = emalloc2(ac + 1, sizeof(char *));
+           ac += 2; /* -c cmnd */
+       }
+
+       av = emalloc2(ac + 1, sizeof(char *));
+       av[0] = (char *)user_details.shell; /* plugin may override shell */
+       if (cmnd != NULL) {
            av[1] = "-c";
            av[2] = cmnd;
        }
-       av[0] = (char *)user_details.shell; /* plugin may override shell */
        av[ac] = NULL;
 
        argv = av;