tags 360604 patch
thanks

Hello,

As a workarround, you can set the SU_NO_SHELL_ARGS environment variable
before calling dchroot, or execute
        dchroot -- -c "command"
instead of
        dchroot -- command

I'm also attaching a patch for dchroot.

Kind Regards,
-- 
Nekral
diff -rauN ../orig/dchroot-0.12/dchroot.c ./dchroot-0.12/dchroot.c
--- ../orig/dchroot-0.12/dchroot.c      2006-01-15 02:08:25.000000000 +0100
+++ ./dchroot-0.12/dchroot.c    2006-04-03 22:19:49.000000000 +0200
@@ -253,39 +253,44 @@
                         * new chroot. 
                         */
 
-                       int argc = 0;
-                       int i = 0, j = 0;
+                       int command_len = 0;
+                       char *command = NULL;
+                       int i = 0;
                        
-                       while (argv[i++] != NULL) {
-                               argc++;
+                       while (argv[i] != NULL) {
+                               command_len += strlen(argv[i++])+1;
                        }
                        
-                       cmd = malloc(sizeof(char *) * (argc + 5));
+                       cmd = malloc(sizeof(char *) * 6);
+                       command = malloc(sizeof(char) * command_len);
                        
-                       if (!cmd) {
+                       if (!cmd || !command) {
                                dchroot_perror("malloc");
                                exit(EXIT_FAILURE);
                        }
-               
+                       
+                       command[0] = '\0';
+                       for (i=0; argv[i] != NULL; i++) {
+                               if (command[0] != '\0') {
+                                       strcat(command, " ");
+                               }
+                               strcat(command, argv[i]);
+                       }
+                       
                        i = 0;
                        cmd[i++] = "/bin/su";
                        
                        if (opts.dir[0] == '\0') {
-                               /* /bin/su - username argv[0] argv[1] ... */
+                               /* /bin/su - username -c "argv[0] argv[1] ..." 
*/
                                cmd[i++] = "-";
                        } else {
-                               /* /bin/su -p username argv[0] argv[1] ... */
+                               /* /bin/su -p username -c "argv[0] argv[1] ..." 
*/
                                cmd[i++] = "-p";
                        }
                        
                        cmd[i++] = username;
-                       cmd[i++] = "--";
-
-                       while (argv[j] != NULL) {
-                               cmd[i++] = argv[j];
-                               j++;
-                       }
-
+                       cmd[i++] = "-c";
+                       cmd[i++] = command;
                        cmd[i] = NULL;
 
                        if (!opts.quiet) {

Reply via email to