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);
        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;
                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]) {
                                        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);
                }
                } 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");
                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"
                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
        },
        {
 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.
 .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
 .B udev
 are also available for the program.
 .br