chiark / gitweb /
[PATCH] remove limit of the number of args passed to PROGRAM
authorgreg@kroah.com <greg@kroah.com>
Fri, 27 Feb 2004 05:29:49 +0000 (21:29 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:32:31 +0000 (21:32 -0700)
If we go over our internal limit of 7, then we call out to /bin/sh
otherwise we handle it ourself without relying on a shell.

namedev.c
test/udev-test.pl
udev.8

index 21f52d1f3cfa31811110997d762be77e12744a1d..7c07e3b10423f9185cea3f1af40c23f9800d23f8 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -421,7 +421,13 @@ static int execute_program(char *path, char *value, int len)
        case 0:
                /* child */
                close(STDOUT_FILENO);
-               dup(fds[1]);    /* dup write side of pipe to STDOUT */
+
+               /* dup write side of pipe to STDOUT */
+               dup(fds[1]);
+
+               /* copy off our path to use incase we have too many args */
+               strnfieldcpy(buffer, path, sizeof(buffer));
+
                if (strchr(path, ' ')) {
                        /* exec with arguments */
                        pos = path;
@@ -431,14 +437,16 @@ static int execute_program(char *path, char *value, int len)
                                        break;
                        }
                        if (args[i]) {
-                               dbg("too many args - %d", i);
-                               args[i] = NULL;
+                               dbg("too many args - %d, using subshell instead '%s'", i, buffer);
+                               retval = execl("/bin/sh", "sh", "-c", buffer, NULL);
+                       } else {
+                               dbg("execute program '%s'", path);
+                               retval = execv(args[0], args);
                        }
-                       retval = execv(args[0], args);
                } else {
                        retval = execv(path, main_argv);
                }
-               dbg("child execve failed");
+               info(FIELD_PROGRAM " execution of '%s' failed", path);
                exit(1);
        case -1:
                dbg("fork failed");
index f2f77dd0e431a539a3cb89a292190ca2344734c6..a3bf768fe3d1d71cd69c6a4781e62620c3150ff4 100644 (file)
@@ -241,6 +241,15 @@ EOF
                expected => "escape-3" ,
                conf     => <<EOF
 BUS="scsi", PROGRAM="/bin/echo -n escape-%%n", KERNEL="sda3", NAME="%c"
+EOF
+       },
+       {
+               desc     => "program with lots of arguments",
+               subsys   => "block",
+               devpath  => "block/sda/sda3",
+               expected => "foo9" ,
+               conf     => <<EOF
+BUS="scsi", PROGRAM="/bin/echo -n foo3 foo4 foo5 foo6 foo7 foo8 foo9", KERNEL="sda3", NAME="%c{7}"
 EOF
        },
        {
diff --git a/udev.8 b/udev.8
index 84b08488fe48eaa62511404597c44d3fa7bec146..8f0060580d7c13e3c94bc966ebd3ae617a2906b7 100644 (file)
--- a/udev.8
+++ b/udev.8
@@ -182,8 +182,7 @@ all of the values being required in order to match the rule.
 .TP
 .B PROGRAM
 Call external program. This key is valid if the program returns successful.
-A few command line options may specified, but shell characters like pipe,
-diversion or similiar options are not available. The environment variables of
+The environment variables of
 .B udev
 are also available for the program.
 .br