summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgreg@kroah.com <greg@kroah.com>2004-02-26 21:29:49 -0800
committerGreg KH <gregkh@suse.de>2005-04-26 21:32:31 -0700
commitdde05ccb8d423fbc5c29f54b0c1b545938c8f151 (patch)
treefbfb4c337f45dd48a0c7524014f54936c42be86f
parent3fe0734266becd2ebcb111b07c3e17b2a9780477 (diff)
downloadsystemd-dde05ccb8d423fbc5c29f54b0c1b545938c8f151.tar.gz
[PATCH] remove limit of the number of args passed to PROGRAM
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.
-rw-r--r--namedev.c18
-rw-r--r--test/udev-test.pl9
-rw-r--r--udev.83
3 files changed, 23 insertions, 7 deletions
diff --git a/namedev.c b/namedev.c
index 21f52d1f3c..7c07e3b104 100644
--- 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");
diff --git a/test/udev-test.pl b/test/udev-test.pl
index f2f77dd0e4..a3bf768fe3 100644
--- a/test/udev-test.pl
+++ b/test/udev-test.pl
@@ -244,6 +244,15 @@ 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
+ },
+ {
desc => "program result substitution (numbered part of)",
subsys => "block",
devpath => "block/sda/sda3",
diff --git a/udev.8 b/udev.8
index 84b08488fe..8f0060580d 100644
--- 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