* [PATCH 1/3] [RESEND] parse_shell_args.c: shell-like argument list parser
@ 2009-02-18 15:16 Kirill A. Shutemov
2009-02-18 15:16 ` [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args() Kirill A. Shutemov
0 siblings, 1 reply; 8+ messages in thread
From: Kirill A. Shutemov @ 2009-02-18 15:16 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-kernel, Matthew Garrett, Kirill A. Shutemov
It's implementation of argument list parser using shell rules.
Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name>
---
include/linux/kernel.h | 2 +
lib/Makefile | 2 +-
lib/parse_shell_args.c | 238 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 241 insertions(+), 1 deletions(-)
create mode 100644 lib/parse_shell_args.c
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 7fa3718..b68d1ba 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -208,6 +208,8 @@ extern int func_ptr_is_kernel_text(void *ptr);
struct pid;
extern struct pid *session_of_pgrp(struct pid *pgrp);
+extern int parse_shell_args(const char *in, char *out, size_t out_size);
+
/*
* FW_BUG
* Add this to a message where you are sure the firmware is buggy or behaves
diff --git a/lib/Makefile b/lib/Makefile
index 32b0e64..3aaf2f3 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -20,7 +20,7 @@ lib-y += kobject.o kref.o klist.o
obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \
- string_helpers.o
+ string_helpers.o parse_shell_args.o
ifeq ($(CONFIG_DEBUG_KOBJECT),y)
CFLAGS_kobject.o += -DDEBUG
diff --git a/lib/parse_shell_args.c b/lib/parse_shell_args.c
new file mode 100644
index 0000000..2b32cab
--- /dev/null
+++ b/lib/parse_shell_args.c
@@ -0,0 +1,238 @@
+/*
+ * lib/parse_shell_args.c
+ *
+ * Copiright (C) 2009 Kirill A. Shutemov
+ *
+ * Shell-like argument list parser
+ */
+
+#ifdef __KERNEL__
+#include <linux/module.h>
+#include <linux/types.h>
+#else
+#include <sys/types.h>
+#endif
+
+#define S_START 0
+#define S_DONE 1
+#define S_NORMAL 2
+#define S_QUOTE 3
+#define S_DQUOTE 4
+
+/**
+ * parse_shell_args - parse shell-like argument list
+ *
+ * @in: null-terminated input string
+ * @out: output buffer
+ * @out_size: output buffer size in byte
+ *
+ * Returns number of arguments or 0 on error.
+ * Parsed arguments store in @out separated by '\0'
+ */
+int parse_shell_args(const char *in, char *out, size_t out_size)
+{
+ int state = S_START;
+ const char *in_p = in;
+ char *out_p = out;
+ int argc = 0;
+ int escape = 0;
+
+ while (state != S_DONE) {
+ if (out_p - out >= out_size)
+ return 0;
+
+ if (escape) {
+ *out_p++ = *in_p++;
+ escape = 0;
+ continue;
+ }
+
+ switch (state) {
+ case S_START:
+ switch (*in_p) {
+ case '\n':
+ case '\0':
+ state = S_DONE;
+ *out_p = '\0';
+ break;
+ case ' ':
+ case '\t':
+ in_p++;
+ break;
+ case '\'':
+ state = S_QUOTE;
+ in_p++;
+ argc++;
+ break;
+ case '"':
+ state = S_DQUOTE;
+ in_p++;
+ argc++;
+ break;
+ default:
+ state = S_NORMAL;
+ argc++;
+ break;
+ }
+ break;
+
+ case S_NORMAL:
+ switch (*in_p) {
+ case '\n':
+ case '\0':
+ state = S_DONE;
+ *out_p = '\0';
+ break;
+ case ' ':
+ case '\t':
+ state = S_START;
+ *out_p++ = '\0';
+ break;
+ case '\'':
+ state = S_QUOTE;
+ in_p++;
+ break;
+ case '\"':
+ state = S_DQUOTE;
+ in_p++;
+ break;
+ case '\\':
+ in_p++;
+ escape = 1;
+ break;
+ default:
+ *out_p++ = *in_p++;
+ break;
+ }
+ break;
+
+ case S_QUOTE:
+ switch (*in_p) {
+ case '\'':
+ state = S_NORMAL;
+ in_p++;
+ break;
+ case '\n':
+ case '\0':
+ return 0;
+ break;
+ default:
+ *out_p++ = *in_p++;
+ break;
+ }
+ break;
+ case S_DQUOTE:
+ switch (*in_p) {
+ case '\"':
+ state = S_NORMAL;
+ in_p++;
+ break;
+ case '\n':
+ case '\0':
+ return 0;
+ break;
+ case '\\':
+ if (*(in_p+1) == '$' ||
+ *(in_p+1) == '`' ||
+ *(in_p+1) == '"' ||
+ *(in_p+1) == '\\' ||
+ *(in_p+1) == '\n') {
+ in_p++;
+ escape = 1;
+ } else
+ *out_p++ = *in_p++;
+ break;
+ default:
+ *out_p++ = *in_p++;
+ break;
+ }
+ break;
+ default:
+ return 0;
+ break;
+ }
+ }
+
+ return argc;
+}
+
+#ifdef __KERNEL__
+EXPORT_SYMBOL(parse_shell_args);
+#else
+/* Unit tests */
+
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+
+static void test_parse(const char *in, const char *expected_out, int expected_argc)
+{
+ char out[PATH_MAX];
+ char *out_p = out;
+ int i;
+ int argc;
+
+ argc = parse_shell_args(in, out, PATH_MAX);
+
+ if (argc != expected_argc) {
+ printf("%s: wrong argc: %d, but expected %d\n", in, argc, expected_argc);
+ return;
+ }
+
+ for(i=0; i < argc; i++) {
+ int len;
+
+ if (strcmp(expected_out, out_p)) {
+ printf("%s: %s, but expected %s\n", in , out_p, expected_out);
+ return;
+ }
+
+ len = strlen(expected_out);
+ expected_out += len + 1;
+ out_p += len + 1;
+ }
+
+ printf("%s:\tOK\n", in);
+}
+
+int main(void)
+{
+ test_parse("", "", 0);
+
+ test_parse("/bin/ls", "/bin/ls", 1);
+ test_parse("/bin\\ ls", "/bin ls", 1);
+ test_parse("/bin/ls\n", "/bin/ls", 1);
+ test_parse("/bin/ls\\\n", "/bin/ls\n", 1);
+ test_parse(" /bin/ls", "/bin/ls", 1);
+ test_parse("\t/bin/ls", "/bin/ls", 1);
+ test_parse("/bin/ls ", "/bin/ls", 1);
+ test_parse("/bin/ls\t", "/bin/ls", 1);
+ test_parse("\\'/bin/ls", "\'/bin/ls", 1);
+ test_parse("/bin\\'/ls", "/bin\'/ls", 1);
+ test_parse("/bin'/ls", "", 0);
+ test_parse("/bin\"/ls", "", 0);
+
+ test_parse("'/bin/ls'", "/bin/ls", 1);
+ test_parse("'/bin ls'", "/bin ls", 1);
+ test_parse("'/bin\tls'", "/bin\tls", 1);
+ test_parse("'/bin''/ls'", "/bin/ls", 1);
+ test_parse("/bin'/ls'", "/bin/ls", 1);
+ test_parse("'/bin'/ls", "/bin/ls", 1);
+ test_parse("'/bin \t\"%$#@/ls'", "/bin \t\"%$#@/ls", 1);
+
+ test_parse("\"/bin/ls\"", "/bin/ls", 1);
+ test_parse("\"/bin\"\"/ls\"", "/bin/ls", 1);
+ test_parse("/bin\"/ls\"", "/bin/ls", 1);
+ test_parse("\"/bin\"/ls", "/bin/ls", 1);
+ test_parse("\"\\$\\`\\\"\\\\\\\n\\\\!\\@\\#\\%\\a\"", "$`\"\\\n\\!\\@\\#\\%\\a", 1);
+ test_parse("\"/bin/ls\\\"", "", 0);
+
+ test_parse("/bin/ls -a", "/bin/ls\0-a", 2);
+ test_parse("/bin/ls\t-a", "/bin/ls\0-a", 2);
+ test_parse("/bin/ls \t \t-a", "/bin/ls\0-a", 2);
+ test_parse("/bin/ls -a -l", "/bin/ls\0-a\0-l", 3);
+ test_parse("/bin/ls '-a -l'", "/bin/ls\0-a -l", 2);
+
+ return 0;
+}
+#endif
--
1.6.1.3.GIT
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args()
2009-02-18 15:16 [PATCH 1/3] [RESEND] parse_shell_args.c: shell-like argument list parser Kirill A. Shutemov
@ 2009-02-18 15:16 ` Kirill A. Shutemov
2009-02-18 15:16 ` [PATCH 3/3] [RESEND] binfmt_misc.c: Allow arguments in interpreter string Kirill A. Shutemov
2009-02-18 15:16 ` [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args() Matthew Garrett
0 siblings, 2 replies; 8+ messages in thread
From: Kirill A. Shutemov @ 2009-02-18 15:16 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-kernel, Matthew Garrett, Kirill A. Shutemov
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3921 bytes --]
parse_shell_args() allows to use more than one argument in shebang.
This patch allows to write something like
#!/usr/bin/env python -c
and it will be parsed according shell rules.
Currently, it interpretes as /usr/bin/env "python -c" and we gets
ENOENT.
Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name>
---
fs/binfmt_script.c | 88 +++++++++++++++++++---------------------------------
1 files changed, 32 insertions(+), 56 deletions(-)
diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c
index 0834350..ab6a6b2 100644
--- a/fs/binfmt_script.c
+++ b/fs/binfmt_script.c
@@ -1,93 +1,69 @@
/*
* linux/fs/binfmt_script.c
*
+ * Copyright (C) 2009 Kirill A. Shutemov
* Copyright (C) 1996 Martin von Löwis
* original #!-checking implemented by tytso.
*/
#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/stat.h>
-#include <linux/slab.h>
#include <linux/binfmts.h>
-#include <linux/init.h>
#include <linux/file.h>
-#include <linux/err.h>
#include <linux/fs.h>
static int load_script(struct linux_binprm *bprm,struct pt_regs *regs)
{
- char *cp, *i_name, *i_arg;
struct file *file;
- char interp[BINPRM_BUF_SIZE];
- int retval;
+ char out[BINPRM_BUF_SIZE];
+ int argc, retval;
if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') ||
(bprm->recursion_depth > BINPRM_MAX_RECURSION))
return -ENOEXEC;
- /*
- * This section does the #! interpretation.
- * Sorta complicated, but hopefully it will work. -TYT
- */
bprm->recursion_depth++;
allow_write_access(bprm->file);
fput(bprm->file);
bprm->file = NULL;
- bprm->buf[BINPRM_BUF_SIZE - 1] = '\0';
- if ((cp = strchr(bprm->buf, '\n')) == NULL)
- cp = bprm->buf+BINPRM_BUF_SIZE-1;
- *cp = '\0';
- while (cp > bprm->buf) {
- cp--;
- if ((*cp == ' ') || (*cp == '\t'))
- *cp = '\0';
- else
- break;
- }
- for (cp = bprm->buf+2; (*cp == ' ') || (*cp == '\t'); cp++);
- if (*cp == '\0')
- return -ENOEXEC; /* No interpreter name found */
- i_name = cp;
- i_arg = NULL;
- for ( ; *cp && (*cp != ' ') && (*cp != '\t'); cp++)
- /* nothing */ ;
- while ((*cp == ' ') || (*cp == '\t'))
- *cp++ = '\0';
- if (*cp)
- i_arg = cp;
- strcpy (interp, i_name);
- /*
- * OK, we've parsed out the interpreter name and
- * (optional) argument.
- * Splice in (1) the interpreter's name for argv[0]
- * (2) (optional) argument to interpreter
- * (3) filename of shell script (replace argv[0])
- *
- * This is done in reverse order, because of how the
- * user environment and arguments are stored.
- */
retval = remove_arg_zero(bprm);
if (retval)
return retval;
+
retval = copy_strings_kernel(1, &bprm->interp, bprm);
- if (retval < 0) return retval;
+ if (retval < 0)
+ return retval;
bprm->argc++;
- if (i_arg) {
- retval = copy_strings_kernel(1, &i_arg, bprm);
- if (retval < 0) return retval;
- bprm->argc++;
+
+ bprm->buf[BINPRM_BUF_SIZE - 1] = '\0';
+
+ argc = parse_shell_args(bprm->buf+2, out, BINPRM_BUF_SIZE);
+
+ if (!argc)
+ return -ENOEXEC;
+
+ {
+ char *argv[argc];
+ char *out_p = out;
+ int i;
+
+ for(i=0; i < argc; i++) {
+ argv[i] = out_p;
+ out_p += strlen(out_p) + 1;
+ }
+
+ retval = copy_strings_kernel(argc, argv, bprm);
+ if (retval)
+ return retval;
+ bprm->argc += argc;
}
- retval = copy_strings_kernel(1, &i_name, bprm);
- if (retval) return retval;
- bprm->argc++;
- bprm->interp = interp;
+
+ bprm->interp = out;
/*
* OK, now restart the process with the interpreter's dentry.
*/
- file = open_exec(interp);
+ file = open_exec(out);
if (IS_ERR(file))
return PTR_ERR(file);
@@ -95,7 +71,7 @@ static int load_script(struct linux_binprm *bprm,struct pt_regs *regs)
retval = prepare_binprm(bprm);
if (retval < 0)
return retval;
- return search_binary_handler(bprm,regs);
+ return search_binary_handler(bprm, regs);
}
static struct linux_binfmt script_format = {
--
1.6.1.3.GIT
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/3] [RESEND] binfmt_misc.c: Allow arguments in interpreter string
2009-02-18 15:16 ` [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args() Kirill A. Shutemov
@ 2009-02-18 15:16 ` Kirill A. Shutemov
2009-02-18 15:16 ` [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args() Matthew Garrett
1 sibling, 0 replies; 8+ messages in thread
From: Kirill A. Shutemov @ 2009-02-18 15:16 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-kernel, Matthew Garrett, Kirill A. Shutemov
Use parse_shell_args() to parse interpreter string. It allows to pass
arguments to interpreter.
Now we can drop dummy wrappers around interpreters.
Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name>
---
fs/binfmt_misc.c | 46 +++++++++++++++++++++++++++++-----------------
1 files changed, 29 insertions(+), 17 deletions(-)
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
index c4e8353..fadb29d 100644
--- a/fs/binfmt_misc.c
+++ b/fs/binfmt_misc.c
@@ -14,6 +14,7 @@
* 1997-06-30 minor cleanup
* 1997-08-09 removed extension stripping, locking cleanup
* 2001-02-28 AV: rewritten into something that resembles C. Original didn't.
+ * 2009-02-03 Allow arguments in interpreter string
*/
#include <linux/module.h>
@@ -50,7 +51,7 @@ typedef struct {
int size; /* size of magic/mask */
char *magic; /* magic or filename extension */
char *mask; /* mask, NULL for exact match */
- char *interpreter; /* filename of interpreter */
+ char *command; /* command to interprete the file */
char *name;
struct dentry *dentry;
} Node;
@@ -107,8 +108,8 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
{
Node *fmt;
struct file * interp_file = NULL;
- char iname[BINPRM_BUF_SIZE];
- char *iname_addr = iname;
+ char out[BINPRM_BUF_SIZE];
+ int argc = 0;
int retval;
int fd_binary = -1;
@@ -120,13 +121,14 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
if (bprm->recursion_depth > BINPRM_MAX_RECURSION)
goto _ret;
- /* to keep locking time low, we copy the interpreter string */
+ /* to keep locking time low, we copy the command string */
read_lock(&entries_lock);
fmt = check_file(bprm);
if (fmt)
- strlcpy(iname, fmt->interpreter, BINPRM_BUF_SIZE);
+ argc = parse_shell_args(fmt->command, out, BINPRM_BUF_SIZE);
read_unlock(&entries_lock);
- if (!fmt)
+
+ if (!argc)
goto _ret;
if (!(fmt->flags & MISC_FMT_PRESERVE_ARGV0)) {
@@ -170,15 +172,25 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
goto _error;
bprm->argc++;
- /* add the interp as argv[0] */
- retval = copy_strings_kernel (1, &iname_addr, bprm);
- if (retval < 0)
- goto _error;
- bprm->argc ++;
+ {
+ char *argv[argc];
+ char *out_p = out;
+ int i;
+
+ for(i=0; i < argc; i++) {
+ argv[i] = out_p;
+ out_p += strlen(out_p) + 1;
+ }
+
+ retval = copy_strings_kernel(argc, argv, bprm);
+ if (retval)
+ return retval;
+ bprm->argc += argc;
+ }
- bprm->interp = iname; /* for binfmt_script */
+ bprm->interp = out; /* for binfmt_script */
- interp_file = open_exec (iname);
+ interp_file = open_exec (out);
retval = PTR_ERR (interp_file);
if (IS_ERR (interp_file))
goto _error;
@@ -287,7 +299,7 @@ static char * check_special_flags (char * sfs, Node * e)
}
/*
* This registers a new binary format, it recognises the syntax
- * ':name:type:offset:magic:mask:interpreter:flags'
+ * ':name:type:offset:magic:mask:command:flags'
* where the ':' is the IFS, that can be chosen with the first char
*/
static Node *create_entry(const char __user *buffer, size_t count)
@@ -379,12 +391,12 @@ static Node *create_entry(const char __user *buffer, size_t count)
goto Einval;
*p++ = '\0';
}
- e->interpreter = p;
+ e->command = p;
p = strchr(p, del);
if (!p)
goto Einval;
*p++ = '\0';
- if (!e->interpreter[0])
+ if (!e->command[0])
goto Einval;
@@ -448,7 +460,7 @@ static void entry_status(Node *e, char *page)
return;
}
- sprintf(page, "%s\ninterpreter %s\n", status, e->interpreter);
+ sprintf(page, "%s\ninterpreter %s\n", status, e->command);
dp = page + strlen(page);
/* print the special flags */
--
1.6.1.3.GIT
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args()
2009-02-18 15:16 ` [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args() Kirill A. Shutemov
2009-02-18 15:16 ` [PATCH 3/3] [RESEND] binfmt_misc.c: Allow arguments in interpreter string Kirill A. Shutemov
@ 2009-02-18 15:16 ` Matthew Garrett
2009-02-18 15:22 ` Kirill A. Shutemov
1 sibling, 1 reply; 8+ messages in thread
From: Matthew Garrett @ 2009-02-18 15:16 UTC (permalink / raw)
To: Kirill A. Shutemov; +Cc: Andrew Morton, linux-kernel
On Wed, Feb 18, 2009 at 05:16:01PM +0200, Kirill A. Shutemov wrote:
> parse_shell_args() allows to use more than one argument in shebang.
As mentioned before, this breaks userspace ABI.
--
Matthew Garrett | mjg59@srcf.ucam.org
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args()
2009-02-18 15:16 ` [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args() Matthew Garrett
@ 2009-02-18 15:22 ` Kirill A. Shutemov
2009-02-18 15:29 ` Matthew Garrett
0 siblings, 1 reply; 8+ messages in thread
From: Kirill A. Shutemov @ 2009-02-18 15:22 UTC (permalink / raw)
To: Matthew Garrett; +Cc: Andrew Morton, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 413 bytes --]
On Wed, Feb 18, 2009 at 03:16:16PM +0000, Matthew Garrett wrote:
> On Wed, Feb 18, 2009 at 05:16:01PM +0200, Kirill A. Shutemov wrote:
> > parse_shell_args() allows to use more than one argument in shebang.
>
> As mentioned before, this breaks userspace ABI.
Do you have real world example of breakage?
--
Regards, Kirill A. Shutemov
+ Belarus, Minsk
+ ALT Linux Team, http://www.altlinux.org/
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args()
2009-02-18 15:22 ` Kirill A. Shutemov
@ 2009-02-18 15:29 ` Matthew Garrett
2009-02-18 16:26 ` Kirill A. Shutemov
2009-02-18 16:45 ` Alan Cox
0 siblings, 2 replies; 8+ messages in thread
From: Matthew Garrett @ 2009-02-18 15:29 UTC (permalink / raw)
To: Kirill A. Shutemov; +Cc: Andrew Morton, linux-kernel
On Wed, Feb 18, 2009 at 05:22:52PM +0200, Kirill A. Shutemov wrote:
> On Wed, Feb 18, 2009 at 03:16:16PM +0000, Matthew Garrett wrote:
> > On Wed, Feb 18, 2009 at 05:16:01PM +0200, Kirill A. Shutemov wrote:
> > > parse_shell_args() allows to use more than one argument in shebang.
> >
> > As mentioned before, this breaks userspace ABI.
>
> Do you have real world example of breakage?
Have you checked every script on every Linux system?
--
Matthew Garrett | mjg59@srcf.ucam.org
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args()
2009-02-18 15:29 ` Matthew Garrett
@ 2009-02-18 16:26 ` Kirill A. Shutemov
2009-02-18 16:45 ` Alan Cox
1 sibling, 0 replies; 8+ messages in thread
From: Kirill A. Shutemov @ 2009-02-18 16:26 UTC (permalink / raw)
To: Matthew Garrett; +Cc: Andrew Morton, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 861 bytes --]
On Wed, Feb 18, 2009 at 03:29:56PM +0000, Matthew Garrett wrote:
> On Wed, Feb 18, 2009 at 05:22:52PM +0200, Kirill A. Shutemov wrote:
> > On Wed, Feb 18, 2009 at 03:16:16PM +0000, Matthew Garrett wrote:
> > > On Wed, Feb 18, 2009 at 05:16:01PM +0200, Kirill A. Shutemov wrote:
> > > > parse_shell_args() allows to use more than one argument in shebang.
> > >
> > > As mentioned before, this breaks userspace ABI.
> >
> > Do you have real world example of breakage?
>
> Have you checked every script on every Linux system?
Ok, I've looked into other kernels(*BSD and OpenSolaris). None of them
parse arguments in shebang. Before 6.x FreeBSD parsed arguments, but then
they changed behaviour.
So, this patch is wrong. What about patch #3?
--
Regards, Kirill A. Shutemov
+ Belarus, Minsk
+ ALT Linux Team, http://www.altlinux.org/
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args()
2009-02-18 15:29 ` Matthew Garrett
2009-02-18 16:26 ` Kirill A. Shutemov
@ 2009-02-18 16:45 ` Alan Cox
1 sibling, 0 replies; 8+ messages in thread
From: Alan Cox @ 2009-02-18 16:45 UTC (permalink / raw)
To: Matthew Garrett; +Cc: Kirill A. Shutemov, Andrew Morton, linux-kernel
> > > As mentioned before, this breaks userspace ABI.
> >
> > Do you have real world example of breakage?
>
> Have you checked every script on every Linux system?
And even if he did its an ABI and an important one. It is fixed and
defined. If you want a non standard behaviour please implement it via
binfmt_misc and a helper.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2009-02-18 16:23 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-18 15:16 [PATCH 1/3] [RESEND] parse_shell_args.c: shell-like argument list parser Kirill A. Shutemov
2009-02-18 15:16 ` [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args() Kirill A. Shutemov
2009-02-18 15:16 ` [PATCH 3/3] [RESEND] binfmt_misc.c: Allow arguments in interpreter string Kirill A. Shutemov
2009-02-18 15:16 ` [PATCH 2/3] [RESEND] binfmt_script: rewrite using parse_shell_args() Matthew Garrett
2009-02-18 15:22 ` Kirill A. Shutemov
2009-02-18 15:29 ` Matthew Garrett
2009-02-18 16:26 ` Kirill A. Shutemov
2009-02-18 16:45 ` Alan Cox
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox