51 lines
1.3 KiB
Plaintext
51 lines
1.3 KiB
Plaintext
Goal: Concatenate the non-su arguments and provide them to the shell with
|
|
the -c option
|
|
Fixes: #317264
|
|
see also #276419
|
|
|
|
Status wrt upstream: This is a Debian specific patch.
|
|
|
|
Note: the fix of the man page is still missing.
|
|
(to be taken from the trunk)
|
|
|
|
Index: shadow-4.1.0/src/su.c
|
|
===================================================================
|
|
--- shadow-4.1.0.orig/src/su.c
|
|
+++ shadow-4.1.0/src/su.c
|
|
@@ -887,6 +887,35 @@
|
|
argv[0] = "-c";
|
|
argv[1] = command;
|
|
}
|
|
+ /* On Debian, the arguments are concatenated and the
|
|
+ * resulting string is always given to the shell with its
|
|
+ * -c option.
|
|
+ */
|
|
+ {
|
|
+ char **parg;
|
|
+ unsigned int cmd_len = 0;
|
|
+ char *cmd = NULL;
|
|
+ if (strcmp(argv[0], "-c") != 0) {
|
|
+ argv--;
|
|
+ argv[0] = "-c";
|
|
+ }
|
|
+ /* Now argv[0] is always -c, and other arguments
|
|
+ * can be concatenated
|
|
+ */
|
|
+ cmd_len = 1; /* finale '\0' */
|
|
+ for (parg = &argv[1]; *parg; parg++) {
|
|
+ cmd_len += strlen (*parg) + 1;
|
|
+ }
|
|
+ cmd = (char *) xmalloc (sizeof (char) * cmd_len);
|
|
+ cmd[0] = '\0';
|
|
+ for (parg = &argv[1]; *parg; parg++) {
|
|
+ strcat (cmd, " ");
|
|
+ strcat (cmd, *parg);
|
|
+ }
|
|
+ cmd[cmd_len - 1] = '\0';
|
|
+ argv[1] = &cmd[1]; /* do not take first space */
|
|
+ argv[2] = NULL;
|
|
+ }
|
|
/*
|
|
* Use the shell and create an argv
|
|
* with the rest of the command line included.
|