FreeBSD Bugzilla – Attachment 140044 Details for
Bug 186490
emulators/qemu-devel: Can't run scripts with shebang args.
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
qemu-devel-shebangflags.patch
qemu-devel-shebangflags.patch (text/x-diff; charset=us-ascii), 5.08 KB, created by
Juergen Lock
on 2014-02-06 11:57:56 UTC
(
hide
)
Description:
qemu-devel-shebangflags.patch
Filename:
MIME Type:
Creator:
Juergen Lock
Created:
2014-02-06 11:57:56 UTC
Size:
5.08 KB
patch
obsolete
>Index: emulators/qemu-devel/Makefile >=================================================================== >--- emulators/qemu-devel/Makefile (revision 342694) >+++ emulators/qemu-devel/Makefile (working copy) >@@ -3,7 +3,7 @@ > > PORTNAME= qemu > PORTVERSION= 1.7.0 >-PORTREVISION= 1 >+PORTREVISION= 2 > CATEGORIES= emulators > MASTER_SITES= http://wiki.qemu.org/download/:release \ > LOCAL/nox:snapshot >@@ -67,6 +67,7 @@ PATCHFILES= \ > 0017-bsd-user-add-support-for-miscellaneous-system-calls.patch \ > 0018-bsd-user-add-arm-mips-and-mips64-options-to-configur.patch > PATCH_DIST_STRIP= -p1 >+EXTRA_PATCHES+= ${FILESDIR}/extra-patch-bsd-user-freebsd-os-proc.c > .endif > > CONFIGURE_ARGS+= --extra-ldflags=-L${LOCALBASE}/lib >Index: emulators/qemu-devel/files/extra-patch-bsd-user-freebsd-os-proc.c >=================================================================== >--- emulators/qemu-devel/files/extra-patch-bsd-user-freebsd-os-proc.c (revision 0) >+++ emulators/qemu-devel/files/extra-patch-bsd-user-freebsd-os-proc.c (working copy) >@@ -0,0 +1,116 @@ >+--- a/bsd-user/freebsd/os-proc.c >+--- b/bsd-user/freebsd/os-proc.c >+@@ -83,7 +83,7 @@ out: >+ } >+ >+ static int >+-is_target_shell_script(int fd, char *interp, size_t size) >++is_target_shell_script(int fd, char *interp, size_t size, char **interp_args) >+ { >+ char buf[2], *p, *b; >+ ssize_t n; >+@@ -120,7 +120,21 @@ is_target_shell_script(int fd, char *int >+ return 0; >+ } >+ if ((p = memchr(b, '\n', size)) != NULL) { >++ int hasargs = 0; >+ *p = 0; >++ >++ *interp_args = NULL; >++ p = interp; >++ while (*p) { >++ if ((*p == ' ') || (*p == '\t')) { >++ hasargs = 1; >++ *p = 0; >++ } else if (hasargs) { >++ *interp_args = p; >++ break; >++ } >++ ++p; >++ } >+ return 1; >+ } >+ b += n; >+@@ -136,7 +150,7 @@ is_target_shell_script(int fd, char *int >+ abi_long freebsd_exec_common(abi_ulong path_or_fd, abi_ulong guest_argp, >+ abi_ulong guest_envp, int do_fexec) >+ { >+- char **argp, **envp, **qargp, **qarg1, **qarg0; >++ char **argp, **envp, **qargp, **qarg1, **qarg0, **qargend; >+ int argc, envc; >+ abi_ulong gp; >+ abi_ulong addr; >+@@ -166,7 +180,7 @@ abi_long freebsd_exec_common(abi_ulong p >+ envc++; >+ } >+ >+- qarg0 = argp = alloca((argc + 4) * sizeof(void *)); >++ qarg0 = argp = alloca((argc + 5) * sizeof(void *)); >+ /* save the first agrument for the emulator */ >+ *argp++ = (char *)getprogname(); >+ qargp = argp; >+@@ -188,7 +202,8 @@ abi_long freebsd_exec_common(abi_ulong p >+ } >+ total_size += strlen(*q) + 1; >+ } >+- *q = NULL; >++ *q++ = NULL; >++ qargend = q; >+ >+ for (gp = guest_envp, q = envp; gp; gp += sizeof(abi_ulong), q++) { >+ if (get_user_ual(addr, gp)) { >+@@ -217,7 +232,7 @@ abi_long freebsd_exec_common(abi_ulong p >+ } >+ >+ if (do_fexec) { >+- char execpath[PATH_MAX]; >++ char execpath[PATH_MAX], *scriptargs; >+ >+ if (((int)path_or_fd > 0 && >+ is_target_elf_binary((int)path_or_fd)) == 1) { >+@@ -238,7 +253,7 @@ abi_long freebsd_exec_common(abi_ulong p >+ goto execve_end; >+ } >+ } else if (is_target_shell_script((int)path_or_fd, execpath, >+- sizeof(execpath)) != 0) { >++ sizeof(execpath), &scriptargs) != 0) { >+ char scriptpath[PATH_MAX]; >+ >+ /* execve() as a target script using emulator. */ >+@@ -246,6 +261,10 @@ abi_long freebsd_exec_common(abi_ulong p >+ sizeof(scriptpath)) != NULL) { >+ *qargp = execpath; >+ *qarg1 = scriptpath; >++ if (scriptargs) { >++ memmove(qarg1 + 1, qarg1, (qargend-qarg1) * sizeof(*qarg1)); >++ *qarg1 = scriptargs; >++ } >+ ret = get_errno(execve(qemu_proc_pathname, qarg0, envp)); >+ } else { >+ ret = -TARGET_EBADF; >+@@ -256,7 +275,7 @@ abi_long freebsd_exec_common(abi_ulong p >+ } >+ } else { >+ int fd; >+- char execpath[PATH_MAX]; >++ char execpath[PATH_MAX], *scriptargs; >+ >+ p = lock_user_string(path_or_fd); >+ if (p == NULL) { >+@@ -275,11 +294,15 @@ abi_long freebsd_exec_common(abi_ulong p >+ *qarg1 = (char *)p; >+ ret = get_errno(execve(qemu_proc_pathname, qargp, envp)); >+ } else if (is_target_shell_script(fd, execpath, >+- sizeof(execpath)) != 0) { >++ sizeof(execpath), &scriptargs) != 0) { >+ close(fd); >+ /* execve() as a target script using emulator. */ >+ *qargp = execpath; >+ *qarg1 = (char *)p; >++ if (scriptargs) { >++ memmove(qarg1 + 1, qarg1, (qargend-qarg1) * sizeof(*qarg1)); >++ *qarg1 = scriptargs; >++ } >+ ret = get_errno(execve(qemu_proc_pathname, qarg0, envp)); >+ } else { >+ close(fd);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 186490
: 140044