From b5c820fe30e8af451a3e3de2e83de7a24775d17f Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 5 Jun 2015 19:30:53 +0200 Subject: re-add exec_filename patches from debian packaging --- debian/patches/exec_filename_exec.patch | 332 ++++++++++ debian/patches/exec_filename_fix.patch | 144 +++++ debian/patches/exec_filename_fs.patch | 1060 +++++++++++++++++++++++++++++++ debian/patches/exec_filename_use.patch | 111 ++++ debian/patches/series | 6 +- 5 files changed, 1651 insertions(+), 2 deletions(-) create mode 100644 debian/patches/exec_filename_exec.patch create mode 100644 debian/patches/exec_filename_fix.patch create mode 100644 debian/patches/exec_filename_fs.patch create mode 100644 debian/patches/exec_filename_use.patch (limited to 'debian') diff --git a/debian/patches/exec_filename_exec.patch b/debian/patches/exec_filename_exec.patch new file mode 100644 index 00000000..632c94a7 --- /dev/null +++ b/debian/patches/exec_filename_exec.patch @@ -0,0 +1,332 @@ +From 011df9d35eb68132cdb14a0f55e2435375e2cfce Mon Sep 17 00:00:00 2001 +From: Emilio Pozuelo Monfort +Date: Wed, 26 May 2010 00:15:37 +0200 +Subject: [PATCH 1/3] Add a new exec_exec_file_name RPC + +* hurd/exec.defs (exec_exec_file_name): New RPC. +(exec_exec): Label as deprecated. +* doc/hurd.texi: Updated. +* exec/exec.c (S_exec_exec_file_name): New function. +(S_exec_exec): Label as deprecated. +(do_exec): Add argument. +* exec/hashexec.c (check_hashbang): Add argument. +Don't guess the file name if file_name_exec is set. +* exec/priv.h (check_hashbang): Add argument. +--- + doc/hurd.texi | 8 ++++---- + exec/exec.c | 50 +++++++++++++++++++++++++++++++++++++++++++++----- + exec/hashexec.c | 18 ++++++++++++------ + exec/priv.h | 4 +++- + hurd/exec.defs | 19 +++++++++++++++++-- + 5 files changed, 81 insertions(+), 18 deletions(-) + +Index: hurd-debian/doc/hurd.texi +=================================================================== +--- hurd-debian.orig/doc/hurd.texi 2014-02-03 22:48:45.000000000 +0000 ++++ hurd-debian/doc/hurd.texi 2014-02-03 23:45:08.000000000 +0000 +@@ -102,7 +102,7 @@ + documentation was last updated for version @value{VERSION} of the Hurd. + + Copyright @copyright{} 1994, 1996, 1998, 1999, 2000, 2001, 2002, 2003, +-2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. ++2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + + @quotation + Permission is granted to make and distribute verbatim copies of +@@ -2766,14 +2766,14 @@ + authentication handle that was not previously present (as opposed to + merely reordering them), then the @code{EXEC_SECURE} and + @code{EXEC_NEWTASK} flags should both be added in the call to +-@code{exec_exec}. ++@code{exec_exec_file_name}. + + The server then needs to open a new port onto the executed file which + will not share any file pointers with the port the user passed in, + opened with @code{O_READ}. Finally, all the information (mutated + appropriately for setuid/setgid) should be sent to the execserver with +-@code{exec_exec}. Whatever error code @code{exec_exec} returns should +-returned to the caller of @code{file_exec}. ++@code{exec_exec_file_name}. Whatever error code @code{exec_exec_file_name} ++returns should be returned to the caller of @code{file_exec}. + + @node File Locking + @subsection File Locking +Index: hurd-debian/exec/exec.c +=================================================================== +--- hurd-debian.orig/exec/exec.c 2014-02-03 22:48:45.000000000 +0000 ++++ hurd-debian/exec/exec.c 2014-02-03 22:48:44.000000000 +0000 +@@ -1,6 +1,6 @@ + /* GNU Hurd standard exec server. +- Copyright (C) 1992,93,94,95,96,98,99,2000,01,02,04 +- Free Software Foundation, Inc. ++ Copyright (C) 1992 ,1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, ++ 2002, 2004, 2010 Free Software Foundation, Inc. + Written by Roland McGrath. + + Can exec ELF format directly. +@@ -738,6 +738,7 @@ + do_exec (file_t file, + task_t oldtask, + int flags, ++ char *filename, + char *argv, mach_msg_type_number_t argvlen, boolean_t argv_copy, + char *envp, mach_msg_type_number_t envplen, boolean_t envp_copy, + mach_port_t *dtable, mach_msg_type_number_t dtablesize, +@@ -796,7 +797,7 @@ + { + /* Check for a #! executable file. */ + check_hashbang (&e, +- file, oldtask, flags, ++ file, oldtask, flags, filename, + argv, argvlen, argv_copy, + envp, envplen, envp_copy, + dtable, dtablesize, dtable_copy, +@@ -1356,6 +1357,7 @@ + return e.error; + } + ++/* Deprecated. */ + kern_return_t + S_exec_exec (struct trivfs_protid *protid, + file_t file, +@@ -1372,13 +1374,51 @@ + mach_port_t *deallocnames, mach_msg_type_number_t ndeallocnames, + mach_port_t *destroynames, mach_msg_type_number_t ndestroynames) + { ++ return S_exec_exec_file_name (protid, ++ file, ++ oldtask, ++ flags, ++ "", ++ argv, argvlen, argv_copy, ++ envp, envplen, envp_copy, ++ dtable, dtablesize, ++ dtable_copy, ++ portarray, nports, ++ portarray_copy, ++ intarray, nints, ++ intarray_copy, ++ deallocnames, ndeallocnames, ++ destroynames, ndestroynames); ++} ++ ++kern_return_t ++S_exec_exec_file_name (struct trivfs_protid *protid, ++ file_t file, ++ task_t oldtask, ++ int flags, ++ char *filename, ++ char *argv, mach_msg_type_number_t argvlen, ++ boolean_t argv_copy, ++ char *envp, mach_msg_type_number_t envplen, ++ boolean_t envp_copy, ++ mach_port_t *dtable, mach_msg_type_number_t dtablesize, ++ boolean_t dtable_copy, ++ mach_port_t *portarray, mach_msg_type_number_t nports, ++ boolean_t portarray_copy, ++ int *intarray, mach_msg_type_number_t nints, ++ boolean_t intarray_copy, ++ mach_port_t *deallocnames, ++ mach_msg_type_number_t ndeallocnames, ++ mach_port_t *destroynames, ++ mach_msg_type_number_t ndestroynames) ++{ + if (! protid) + return EOPNOTSUPP; + + /* There were no user-specified exec servers, + or none of them could be found. */ + +- return do_exec (file, oldtask, flags, ++ return do_exec (file, oldtask, flags, filename, + argv, argvlen, argv_copy, + envp, envplen, envp_copy, + dtable, dtablesize, dtable_copy, +Index: hurd-debian/exec/hashexec.c +=================================================================== +--- hurd-debian.orig/exec/hashexec.c 2014-02-03 22:48:45.000000000 +0000 ++++ hurd-debian/exec/hashexec.c 2014-02-03 23:45:08.000000000 +0000 +@@ -1,5 +1,6 @@ + /* GNU Hurd standard exec server, #! script execution support. +- Copyright (C) 1995,96,97,98,99,2000,02 Free Software Foundation, Inc. ++ Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2010 ++ Free Software Foundation, Inc. + Written by Roland McGrath. + + This file is part of the GNU Hurd. +@@ -35,6 +36,7 @@ + file_t file, + task_t oldtask, + int flags, ++ char *file_name_exec, + char *argv, u_int argvlen, boolean_t argv_copy, + char *envp, u_int envplen, boolean_t envp_copy, + mach_port_t *dtable, u_int dtablesize, boolean_t dtable_copy, +@@ -225,10 +227,12 @@ + file_name = NULL; + else if (! (flags & EXEC_SECURE)) + { +- /* Try to figure out the file's name. We guess that if ARGV[0] +- contains a slash, it might be the name of the file; and that +- if it contains no slash, looking for files named by ARGV[0] in +- the `PATH' environment variable might find it. */ ++ /* Try to figure out the file's name. If FILE_NAME_EXEC ++ is not NULL, then it's the file's name. Otherwise we ++ guess that if ARGV[0] contains a slash, it might be ++ the name of the file; and that if it contains no slash, ++ looking for files named by ARGV[0] in the `PATH' ++ environment variable might find it. */ + + error_t error; + char *name; +@@ -278,7 +282,9 @@ + else + name = argv; + +- if (strchr (name, '/') != NULL) ++ if (file_name_exec && file_name_exec[0] != '\0') ++ error = lookup (name = file_name_exec, 0, &name_file); ++ else if (strchr (name, '/') != NULL) + error = lookup (name, 0, &name_file); + else if ((error = hurd_catch_signal + (sigmask (SIGBUS) | sigmask (SIGSEGV), +Index: hurd-debian/exec/priv.h +=================================================================== +--- hurd-debian.orig/exec/priv.h 2014-02-03 22:48:45.000000000 +0000 ++++ hurd-debian/exec/priv.h 2014-02-03 22:48:44.000000000 +0000 +@@ -1,5 +1,6 @@ + /* GNU Hurd standard exec server, private declarations. +- Copyright (C) 1992,93,94,95,96,99,2000,02, 04 Free Software Foundation, Inc. ++ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2002, 2004, ++ 2010 Free Software Foundation, Inc. + Written by Roland McGrath. + + This file is part of the GNU Hurd. +@@ -32,6 +33,7 @@ + #include /* This gives us the ElfW macro. */ + #include + #include "exec_S.h" ++#include "exec_experimental_S.h" + + + #ifndef exec_priv_h +@@ -134,6 +136,7 @@ + file_t file, + task_t oldtask, + int flags, ++ char *filename, + char *argv, u_int argvlen, boolean_t argv_copy, + char *envp, u_int envplen, boolean_t envp_copy, + mach_port_t *dtable, u_int dtablesize, +Index: hurd-debian/hurd/exec.defs +=================================================================== +--- hurd-debian.orig/hurd/exec.defs 2014-02-03 22:48:45.000000000 +0000 ++++ hurd-debian/hurd/exec.defs 2014-02-03 22:48:44.000000000 +0000 +@@ -1,5 +1,6 @@ + /* Interface definitions for the exec servers. +- Copyright (C) 1991,92,93,94,95,2001 Free Software Foundation, Inc. ++ Copyright (C) 1991, 1992, 1993, 1994, 1995, 2001, 2010 ++ Free Software Foundation, Inc. + + This file is part of the GNU Hurd. + +@@ -29,6 +30,7 @@ + + INTR_INTERFACE + ++/* Deprecated: use exec_exec_file_name instead. */ + routine exec_exec ( + execserver: file_t; + file: mach_port_send_t; +Index: hurd-debian/hurd/exec_experimental.defs +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ hurd-debian/hurd/exec_experimental.defs 2014-02-03 22:48:44.000000000 +0000 +@@ -0,0 +1,46 @@ ++/* Interface definitions for the exec servers. ++ Copyright (C) 1991, 1992, 1993, 1994, 1995, 2001, 2010, 2012 ++ Free Software Foundation, Inc. ++ ++This file is part of the GNU Hurd. ++ ++The GNU Hurd is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++The GNU Hurd is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with the GNU Hurd; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++/* Written by Michael I. Bushnell and Roland McGrath. */ ++ ++subsystem exec_experimental 434242; ++ ++#include ++ ++#ifdef EXEC_IMPORTS ++EXEC_IMPORTS ++#endif ++ ++INTR_INTERFACE ++ ++routine exec_exec_file_name ( ++ execserver: file_t; ++ file: mach_port_send_t; ++ oldtask: task_t; ++ flags: int; ++ filename: string_t; ++ argv: data_t SCP; ++ envp: data_t SCP; ++ dtable: portarray_t SCP; ++ portarray: portarray_t SCP; ++ intarray: intarray_t SCP; ++ deallocnames: mach_port_name_array_t; ++ destroynames: mach_port_name_array_t); ++ +Index: hurd-debian/exec/Makefile +=================================================================== +--- hurd-debian.orig/exec/Makefile 2014-02-03 22:48:45.000000000 +0000 ++++ hurd-debian/exec/Makefile 2014-02-03 22:48:44.000000000 +0000 +@@ -22,7 +22,7 @@ + + SRCS = exec.c main.c hashexec.c hostarch.c + OBJS = main.o hostarch.o exec.o hashexec.o \ +- execServer.o exec_startupServer.o ++ execServer.o exec_startupServer.o exec_experimentalServer.o + + target = exec + #targets = exec exec.static +@@ -30,6 +30,7 @@ + + exec-MIGSFLAGS = -imacros $(srcdir)/execmutations.h + exec_startup-MIGSFLAGS = -imacros $(srcdir)/execmutations.h ++exec_experimental-MIGSFLAGS = -imacros $(srcdir)/execmutations.h + + include ../Makeconf + +Index: hurd-debian/exec/main.c +=================================================================== +--- hurd-debian.orig/exec/main.c 2014-02-03 22:48:45.000000000 +0000 ++++ hurd-debian/exec/main.c 2014-02-03 23:45:19.000000000 +0000 +@@ -47,6 +47,7 @@ + + + #include "exec_S.h" ++#include "exec_experimental_S.h" + #include "exec_startup_S.h" + + static int +@@ -54,6 +55,7 @@ + { + mig_routine_t routine; + if ((routine = exec_server_routine (inp)) || ++ (routine = exec_experimental_server_routine (inp)) || + (routine = NULL, trivfs_demuxer (inp, outp)) || + (routine = exec_startup_server_routine (inp))) + { diff --git a/debian/patches/exec_filename_fix.patch b/debian/patches/exec_filename_fix.patch new file mode 100644 index 00000000..71836d9b --- /dev/null +++ b/debian/patches/exec_filename_fix.patch @@ -0,0 +1,144 @@ +From: Justus Winter <4winter@informatik.uni-hamburg.de> + +This patch is an amendment of exec_filename_exec.patch. + +If file_name_exec is not given, check_hashbang will try to locate the +file. If argv[0] contains a '/', the file path is assumed to be +absolute and it will try to open the file. Otherwise, the file is +searched in the PATH. In either case, the resulting file identity port +is compared to the identity port of the original file handle passed to +check_hashbang. + +exec_filename_exec.patch explicitly provides the script files path in +file_name_exec. According to the comment, if this path is provided, it +is assumed to be the path to the script file and no attempt at +locating the script file is done. However, the identity ports are +still compared. This cannot succeed if fakeroot or chroot is used, +because the process doing the exec and thus the initial file lookup is +running in the chrooted environment, while the exec server is not. + +Fix this by skipping the identity test if file_name_exec is provided. + +* exec/hashexec.c (check_hashbang): Skip the file identity test if the + file_name_exec is provided. +--- + exec/hashexec.c | 91 ++++++++++++++++++++++++++++++------------------------- + 1 file changed, 50 insertions(+), 41 deletions(-) + +--- a/exec/hashexec.c ++++ b/exec/hashexec.c +@@ -231,11 +231,12 @@ check_hashbang (struct execdata *e, + else if (! (flags & EXEC_SECURE)) + { + /* Try to figure out the file's name. If FILE_NAME_EXEC +- is not NULL, then it's the file's name. Otherwise we +- guess that if ARGV[0] contains a slash, it might be +- the name of the file; and that if it contains no slash, +- looking for files named by ARGV[0] in the `PATH' +- environment variable might find it. */ ++ is not NULL and not the empty string, then it's the ++ file's name. Otherwise we guess that if ARGV[0] ++ contains a slash, it might be the name of the file; ++ and that if it contains no slash, looking for files ++ named by ARGV[0] in the `PATH' environment variable ++ might find it. */ + + error_t error; + char *name; +@@ -271,51 +272,59 @@ check_hashbang (struct execdata *e, + return err; + } + +- error = io_identity (file, &fileid, &filefsid, &fileno); +- if (error) +- goto out; +- mach_port_deallocate (mach_task_self (), filefsid); +- +- if (memchr (argv, '\0', argvlen) == NULL) +- { +- name = alloca (argvlen + 1); +- bcopy (argv, name, argvlen); +- name[argvlen] = '\0'; +- } +- else +- name = argv; +- + if (file_name_exec && file_name_exec[0] != '\0') +- error = lookup (name = file_name_exec, 0, &name_file); +- else if (strchr (name, '/') != NULL) +- error = lookup (name, 0, &name_file); +- else if ((error = hurd_catch_signal +- (sigmask (SIGBUS) | sigmask (SIGSEGV), +- (vm_address_t) envp, (vm_address_t) envp + envplen, +- &search_path, SIG_ERR))) +- name_file = MACH_PORT_NULL; +- +- if (!error && name_file != MACH_PORT_NULL) ++ name = file_name_exec; ++ else + { +- mach_port_t id, fsid; +- ino_t ino; +- error = io_identity (name_file, &id, &fsid, &ino); +- mach_port_deallocate (mach_task_self (), name_file); +- if (!error) ++ /* Try to locate the file. */ ++ error = io_identity (file, &fileid, &filefsid, &fileno); ++ if (error) ++ goto out; ++ mach_port_deallocate (mach_task_self (), filefsid); ++ ++ if (memchr (argv, '\0', argvlen) == NULL) + { +- mach_port_deallocate (mach_task_self (), fsid); +- mach_port_deallocate (mach_task_self (), id); ++ name = alloca (argvlen + 1); ++ bcopy (argv, name, argvlen); ++ name[argvlen] = '\0'; + } +- if (!error && id == fileid) ++ else ++ name = argv; ++ ++ if (strchr (name, '/') != NULL) ++ error = lookup (name, 0, &name_file); ++ else if ((error = hurd_catch_signal ++ (sigmask (SIGBUS) | sigmask (SIGSEGV), ++ (vm_address_t) envp, (vm_address_t) envp + envplen, ++ &search_path, SIG_ERR))) ++ name_file = MACH_PORT_NULL; ++ ++ /* See whether we found the right file. */ ++ if (!error && name_file != MACH_PORT_NULL) + { +- file_name = name; +- free_file_name = free_name; ++ mach_port_t id, fsid; ++ ino_t ino; ++ error = io_identity (name_file, &id, &fsid, &ino); ++ mach_port_deallocate (mach_task_self (), name_file); ++ if (!error) ++ { ++ mach_port_deallocate (mach_task_self (), fsid); ++ mach_port_deallocate (mach_task_self (), id); ++ if (id != fileid) ++ error = 1; ++ } + } +- else if (free_name) +- free (name); ++ ++ mach_port_deallocate (mach_task_self (), fileid); + } + +- mach_port_deallocate (mach_task_self (), fileid); ++ if (!error) ++ { ++ file_name = name; ++ free_file_name = free_name; ++ } ++ else if (free_name) ++ free (name); + } + + if (file_name == NULL) diff --git a/debian/patches/exec_filename_fs.patch b/debian/patches/exec_filename_fs.patch new file mode 100644 index 00000000..15054fdb --- /dev/null +++ b/debian/patches/exec_filename_fs.patch @@ -0,0 +1,1060 @@ +From ba528e4a9db131112aa09edfdbb3449b55618578 Mon Sep 17 00:00:00 2001 +From: Emilio Pozuelo Monfort +Date: Wed, 26 May 2010 01:27:40 +0200 +Subject: [PATCH 2/3] Add a file_exec_file_name RPC + +* hurd/fs.defs (file_exec): Deprecate in favor of... +(file_exec_file_name): ...this new RPC. +Change all implementations and forward old implementations to +the new version. Change all callers but fallback to old version. +Change comments and documentation. +--- + TODO | 2 +- + doc/hurd.texi | 16 ++++---- + exec/hashexec.c | 32 ++++++++++---- + hurd/fs.defs | 28 +++++++++++-- + hurd/hurd_types.h | 9 ++-- + startup/startup.c | 81 ++++++++++++++++++++++++++---------- + libdiskfs/boot-start.c | 2 +- + libdiskfs/file-exec.c | 75 ++++++++++++++++++++++++++++------ + libfshelp/start-translator-long.c | 21 +++++++--- + libnetfs/file-exec.c | 67 ++++++++++++++++++++++++++---- + libtrivfs/file-exec.c | 27 ++++++++++++- + trans/fakeroot.c | 59 ++++++++++++++++++++++++--- + utils/login.c | 23 +++++++--- + 13 files changed, 350 insertions(+), 92 deletions(-) + +Index: hurd-debian/TODO +=================================================================== +--- hurd-debian.orig/TODO ++++ hurd-debian/TODO +@@ -133,7 +133,7 @@ See `tasks', the exported task list. + + ** libtrivfs + *** Allow for read/write/exec to be passed down. +-*** Implement file_exec when appropriate. !! ++*** Implement file_exec_file_name when appropriate. !! + *** Provide for the visible owner, etc., to be held in command-line args + instead of the underlying node, when it's important. !! + +Index: hurd-debian/doc/hurd.texi +=================================================================== +--- hurd-debian.orig/doc/hurd.texi ++++ hurd-debian/doc/hurd.texi +@@ -2737,10 +2737,10 @@ write the file. + @node Program Execution + @subsection Program Execution + +-@findex file_exec ++@findex file_exec_file_name + Execution of programs on the Hurd is done through fileservers with the +-@code{file_exec} RPC. The fileserver is expected to verify that the +-user is allowed to execute the file, make whatever modifications to the ++@code{file_exec_file_name} RPC. The fileserver is expected to verify that ++the user is allowed to execute the file, make whatever modifications to the + ports are necessary for setuid execution, and then invoke the standard + execserver found on @file{/servers/exec}. + +@@ -2752,13 +2752,13 @@ The file must be opened for execution; i + be returned. In addition, at least one of the execute bits must be on. A + failure of this check should result in @code{EACCES}---not + @code{ENOEXEC}. It is not proper for the fileserver ever to respond to +-the @code{file_exec} RPC with @code{ENOEXEC}. ++the @code{file_exec_file_name} RPC with @code{ENOEXEC}. + + If either the setuid or setgid bits are set, the server needs to + construct a new authentication handle with the additional new ID's. +-Then all the ports passed to @code{file_exec} need to be reauthenticated +-with the new handle. If the fileserver is unable to make the new +-authentication handle (for example, because it is not running as root) ++Then all the ports passed to @code{file_exec_file_name} need to be ++reauthenticated with the new handle. If the fileserver is unable to make the ++new authentication handle (for example, because it is not running as root) + it is not acceptable to return an error; in such a case the server + should simply silently fail to implement the setuid/setgid semantics. + +@@ -2773,7 +2773,7 @@ will not share any file pointers with th + opened with @code{O_READ}. Finally, all the information (mutated + appropriately for setuid/setgid) should be sent to the execserver with + @code{exec_exec_file_name}. Whatever error code @code{exec_exec_file_name} +-returns should be returned to the caller of @code{file_exec}. ++returns should be returned to the caller of @code{file_exec_file_name}. + + @node File Locking + @subsection File Locking +Index: hurd-debian/exec/hashexec.c +=================================================================== +--- hurd-debian.orig/exec/hashexec.c ++++ hurd-debian/exec/hashexec.c +@@ -24,6 +24,9 @@ the Free Software Foundation, 675 Mass A + #include + #include + #include ++#ifdef HAVE_FILE_EXEC_FILE_NAME ++#include ++#endif + + /* This is called to check E for a #! interpreter specification. E has + already been prepared (successfully) and checked (unsuccessfully). If +@@ -421,16 +424,32 @@ check_hashbang (struct execdata *e, + /* We cannot open the interpreter file to execute it. Lose! */ + return; + ++#ifdef HAVE_FILE_EXEC_FILE_NAME + /* Execute the interpreter program. */ +- e->error = file_exec (interp_file, +- oldtask, flags, +- new_argv, new_argvlen, envp, envplen, +- new_dtable ?: dtable, MACH_MSG_TYPE_COPY_SEND, +- new_dtable ? new_dtablesize : dtablesize, +- portarray, MACH_MSG_TYPE_COPY_SEND, nports, +- intarray, nints, +- deallocnames, ndeallocnames, +- destroynames, ndestroynames); ++ e->error = file_exec_file_name (interp_file, ++ oldtask, flags, interp, ++ new_argv, new_argvlen, envp, envplen, ++ new_dtable ?: dtable, ++ MACH_MSG_TYPE_COPY_SEND, ++ new_dtable ? new_dtablesize : dtablesize, ++ portarray, MACH_MSG_TYPE_COPY_SEND, nports, ++ intarray, nints, ++ deallocnames, ndeallocnames, ++ destroynames, ndestroynames); ++ /* For backwards compatibility. Just drop it when we kill file_exec. */ ++ if (e->error == MIG_BAD_ID) ++#endif ++ e->error = file_exec (interp_file, ++ oldtask, flags, ++ new_argv, new_argvlen, envp, envplen, ++ new_dtable ?: dtable, MACH_MSG_TYPE_COPY_SEND, ++ new_dtable ? new_dtablesize : dtablesize, ++ portarray, MACH_MSG_TYPE_COPY_SEND, nports, ++ intarray, nints, ++ deallocnames, ndeallocnames, ++ destroynames, ndestroynames); ++ ++ + mach_port_deallocate (mach_task_self (), interp_file); + munmap (new_argv, new_argvlen); + +Index: hurd-debian/hurd/fs.defs +=================================================================== +--- hurd-debian.orig/hurd/fs.defs ++++ hurd-debian/hurd/fs.defs +@@ -1,5 +1,6 @@ + /* Definitions for the filesystem interface. +- Copyright (C) 1994,95,96,97,98,99,2002 Free Software Foundation, Inc. ++ Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2010 ++ Free Software Foundation, Inc. + + This file is part of the GNU Hurd. + +@@ -35,7 +36,8 @@ INTR_INTERFACE + /* Overlay a task with a file. Necessary initialization, including + authentication changes associated with set[ug]id execution must be + handled by the filesystem. Filesystems normally implement this by +- using exec_newtask or exec_loadtask as appropriate. */ ++ using exec_newtask or exec_loadtask as appropriate. ++ Deprecated: use file_exec_file_name instead. */ + routine file_exec ( + exec_file: file_t; + RPT +@@ -129,8 +131,8 @@ routine file_lock_stat ( + (regardless of the current open modes for this port). ALLOWED is a + bitwise OR of O_READ, O_WRITE, and O_EXEC. This is not necessarily the + same as what an open or exec would allow; O_EXEC is set for root even if +- no executable bits are on (in which case file_exec should fail) and +- O_WRITE is set a directory can be modified, even though it can't be ++ no executable bits are on (in which case file_exec_file_name should fail) ++ and O_WRITE is set a directory can be modified, even though it can't be + written directly. */ + routine file_check_access ( + file: file_t; +Index: hurd-debian/hurd/hurd_types.h +=================================================================== +--- hurd-debian.orig/hurd/hurd_types.h ++++ hurd-debian/hurd/hurd_types.h +@@ -1,5 +1,6 @@ + /* C declarations for Hurd server interfaces +- Copyright (C) 1993,94,95,96,98,99,2001,02 Free Software Foundation, Inc. ++ Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2002, ++ 2010 Free Software Foundation, Inc. + + This file is part of the GNU Hurd. + +@@ -81,7 +82,7 @@ typedef struct timespec timespec_t; + /* Many such parameters and flags are also defined in various libc + headers. */ + +-/* Bits for flags in fs.defs:file_exec and exec.defs:exec_* calls: */ ++/* Bits for flags in fs.defs:file_exec_file_name and exec.defs:exec_* calls: */ + #define EXEC_NEWTASK 0x00000001 /* Create new task; kill old one. */ + #define EXEC_SECURE 0x00000002 /* Use secure values of portarray, etc. */ + #define EXEC_DEFAULTS 0x00000004 /* Use defaults for unspecified ports. */ +@@ -347,7 +348,7 @@ typedef int *procinfo_t; + #define FSTYPE_MEMFS 0x00000019 /* In-core filesystem */ + #define FSTYPE_ISO9660 0x0000001a /* ISO9660 */ + +-/* Standard port assignments for file_exec and exec_* */ ++/* Standard port assignments for file_exec_file_name and exec_* */ + enum + { + INIT_PORT_CWDIR, +@@ -361,7 +362,7 @@ enum + INIT_PORT_MAX + }; + +-/* Standard ints for file_exec and exec_* */ ++/* Standard ints for file_exec_file_name and exec_* */ + enum + { + INIT_UMASK, +Index: hurd-debian/startup/startup.c +=================================================================== +--- hurd-debian.orig/startup/startup.c ++++ hurd-debian/startup/startup.c +@@ -1,7 +1,7 @@ + /* Start and maintain hurd core servers and system run state + + Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +- 2005, 2008, 2013 Free Software Foundation, Inc. ++ 2005, 2008, 2010, 2013 Free Software Foundation, Inc. + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or modify +@@ -24,6 +24,9 @@ + one file. */ + #include + #include ++#ifdef HAVE_FILE_EXEC_FILE_NAME ++#include ++#endif + #include + #include + #include +@@ -376,13 +379,28 @@ run (const char *server, mach_port_t *po + getchar (); + } + task_set_name (*task, (char *) prog); +- err = file_exec (file, *task, 0, +- (char *)prog, strlen (prog) + 1, /* Args. */ +- startup_envz, startup_envz_len, +- default_dtable, MACH_MSG_TYPE_COPY_SEND, 3, +- ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, +- default_ints, INIT_INT_MAX, +- NULL, 0, NULL, 0); ++#ifdef HAVE_FILE_EXEC_FILE_NAME ++ err = file_exec_file_name (file, *task, 0, (char *)prog, ++ (char *)prog, ++ strlen (prog) + 1, /* Args. */ ++ startup_envz, startup_envz_len, ++ default_dtable, ++ MACH_MSG_TYPE_COPY_SEND, 3, ++ ports, MACH_MSG_TYPE_COPY_SEND, ++ INIT_PORT_MAX, ++ default_ints, INIT_INT_MAX, ++ NULL, 0, NULL, 0); ++ /* For backwards compatibility. Just drop it when we kill ++ file_exec. */ ++ if (err == MIG_BAD_ID) ++#endif ++ err = file_exec (file, *task, 0, ++ (char *)prog, strlen (prog) + 1, /* Args. */ ++ startup_envz, startup_envz_len, ++ default_dtable, MACH_MSG_TYPE_COPY_SEND, 3, ++ ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, ++ default_ints, INIT_INT_MAX, ++ NULL, 0, NULL, 0); + if (!err) + break; + +@@ -469,14 +487,27 @@ run_for_real (char *filename, char *args + ++progname; + else + progname = filename; +- err = file_exec (file, task, 0, +- args, arglen, +- startup_envz, startup_envz_len, +- default_dtable, MACH_MSG_TYPE_COPY_SEND, 3, +- default_ports, MACH_MSG_TYPE_COPY_SEND, +- INIT_PORT_MAX, +- default_ints, INIT_INT_MAX, +- NULL, 0, NULL, 0); ++#ifdef HAVE_FILE_EXEC_FILE_NAME ++ err = file_exec_file_name (file, task, 0, filename, ++ args, arglen, ++ startup_envz, startup_envz_len, ++ default_dtable, MACH_MSG_TYPE_COPY_SEND, 3, ++ default_ports, MACH_MSG_TYPE_COPY_SEND, ++ INIT_PORT_MAX, ++ default_ints, INIT_INT_MAX, ++ NULL, 0, NULL, 0); ++ /* For backwards compatibility. Just drop it when we kill file_exec. */ ++ if (err == MIG_BAD_ID) ++#endif ++ err = file_exec (file, task, 0, ++ args, arglen, ++ startup_envz, startup_envz_len, ++ default_dtable, MACH_MSG_TYPE_COPY_SEND, 3, ++ default_ports, MACH_MSG_TYPE_COPY_SEND, ++ INIT_PORT_MAX, ++ default_ints, INIT_INT_MAX, ++ NULL, 0, NULL, 0); ++ + mach_port_deallocate (mach_task_self (), default_ports[INIT_PORT_PROC]); + mach_port_deallocate (mach_task_self (), task); + if (ctty != MACH_PORT_NULL) +@@ -1035,13 +1066,26 @@ start_child (const char *prog, char **pr + getchar (); + } + +- err = file_exec (file, child_task, 0, +- args, arglen, +- startup_envz, startup_envz_len, +- NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds. */ +- default_ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, +- default_ints, INIT_INT_MAX, +- NULL, 0, NULL, 0); ++#ifdef HAVE_FILE_EXEC_FILE_NAME ++ err = file_exec_file_name (file, child_task, 0, args, ++ args, arglen, ++ startup_envz, startup_envz_len, ++ NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds. */ ++ default_ports, MACH_MSG_TYPE_COPY_SEND, ++ INIT_PORT_MAX, ++ default_ints, INIT_INT_MAX, ++ NULL, 0, NULL, 0); ++ /* For backwards compatibility. Just drop it when we kill file_exec. */ ++ if (err == MIG_BAD_ID) ++#endif ++ err = file_exec (file, child_task, 0, ++ args, arglen, ++ startup_envz, startup_envz_len, ++ NULL, MACH_MSG_TYPE_COPY_SEND, 0, /* No fds. */ ++ default_ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, ++ default_ints, INIT_INT_MAX, ++ NULL, 0, NULL, 0); ++ + proc_mark_important (default_ports[INIT_PORT_PROC]); + mach_port_deallocate (mach_task_self (), default_ports[INIT_PORT_PROC]); + mach_port_deallocate (mach_task_self (), file); +Index: hurd-debian/libdiskfs/boot-start.c +=================================================================== +--- hurd-debian.orig/libdiskfs/boot-start.c ++++ hurd-debian/libdiskfs/boot-start.c +@@ -209,7 +209,7 @@ diskfs_start_bootstrap () + diskfs_exec_ctl = MACH_PORT_NULL; /* Not used after this. */ + } + +- /* Cache the exec server port for file_exec to use. */ ++ /* Cache the exec server port for file_exec_file_name to use. */ + _hurd_port_set (&_diskfs_exec_portcell, diskfs_exec); + + if (_diskfs_boot_command) +Index: hurd-debian/libdiskfs/file-exec.c +=================================================================== +--- hurd-debian.orig/libdiskfs/file-exec.c ++++ hurd-debian/libdiskfs/file-exec.c +@@ -1,5 +1,6 @@ +-/* File execution (file_exec RPC) for diskfs servers, using exec server. +- Copyright (C) 1993,94,95,96,97,98,2000,02 Free Software Foundation, Inc. ++/* File execution (file_exec_file_name RPC) for diskfs servers, using exec server. ++ Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002, ++ 2010 Free Software Foundation, Inc. + + This file is part of the GNU Hurd. + +@@ -21,10 +22,14 @@ the Free Software Foundation, 675 Mass A + + #include "priv.h" + #include "fs_S.h" ++#include "fs_experimental_S.h" + #include + #include + #include + #include ++#ifdef HAVE_EXEC_EXEC_FILE_NAME ++#include ++#endif + #include + #include + +@@ -47,6 +52,39 @@ diskfs_S_file_exec (struct protid *cred, + mach_port_t *destroynames, + size_t destroynameslen) + { ++ return diskfs_S_file_exec_file_name (cred, ++ task, ++ flags, ++ "", ++ argv, argvlen, ++ envp, envplen, ++ fds, fdslen, ++ portarray, portarraylen, ++ intarray, intarraylen, ++ deallocnames, deallocnameslen, ++ destroynames, destroynameslen); ++} ++ ++kern_return_t ++diskfs_S_file_exec_file_name (struct protid *cred, ++ task_t task, ++ int flags, ++ char *filename, ++ char *argv, ++ size_t argvlen, ++ char *envp, ++ size_t envplen, ++ mach_port_t *fds, ++ size_t fdslen, ++ mach_port_t *portarray, ++ size_t portarraylen, ++ int *intarray, ++ size_t intarraylen, ++ mach_port_t *deallocnames, ++ size_t deallocnameslen, ++ mach_port_t *destroynames, ++ size_t destroynameslen) ++{ + struct node *np; + uid_t uid; + gid_t gid; +@@ -136,9 +174,9 @@ diskfs_S_file_exec (struct protid *cred, + + if (! err) + /* Make a new peropen for the exec server to access the file, since any +- seeking the exec server might want to do should not affect the +- original peropen on which file_exec was called. (The new protid for +- this peropen clones the caller's iouser to preserve the caller's ++ seeking the exec server might want to do should not affect the original ++ peropen on which file_exec_file_name was called. (The new protid ++ for this peropen clones the caller's iouser to preserve the caller's + authentication credentials.) The new peropen's openmodes must have + O_READ even if the caller had only O_EXEC privilege, so the exec + server can read the executable file. We also include O_EXEC so that +@@ -159,14 +197,31 @@ diskfs_S_file_exec (struct protid *cred, + do + { + right = ports_get_send_right (newpi); +- err = exec_exec (execserver, +- right, MACH_MSG_TYPE_COPY_SEND, +- task, flags, argv, argvlen, envp, envplen, +- fds, MACH_MSG_TYPE_COPY_SEND, fdslen, +- portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, +- intarray, intarraylen, +- deallocnames, deallocnameslen, +- destroynames, destroynameslen); ++#ifdef HAVE_EXEC_EXEC_FILE_NAME ++ err = exec_exec_file_name (execserver, ++ right, MACH_MSG_TYPE_COPY_SEND, ++ task, flags, filename, ++ argv, argvlen, envp, envplen, ++ fds, MACH_MSG_TYPE_COPY_SEND, fdslen, ++ portarray, MACH_MSG_TYPE_COPY_SEND, ++ portarraylen, ++ intarray, intarraylen, ++ deallocnames, deallocnameslen, ++ destroynames, destroynameslen); ++ /* For backwards compatibility. Just drop it when we kill ++ exec_exec. */ ++ if (err == MIG_BAD_ID) ++#endif ++ err = exec_exec (execserver, ++ right, MACH_MSG_TYPE_COPY_SEND, ++ task, flags, argv, argvlen, envp, envplen, ++ fds, MACH_MSG_TYPE_COPY_SEND, fdslen, ++ portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, ++ intarray, intarraylen, ++ deallocnames, deallocnameslen, ++ destroynames, destroynameslen); ++ ++ + mach_port_deallocate (mach_task_self (), right); + if (err == MACH_SEND_INVALID_DEST) + { +Index: hurd-debian/libfshelp/start-translator-long.c +=================================================================== +--- hurd-debian.orig/libfshelp/start-translator-long.c ++++ hurd-debian/libfshelp/start-translator-long.c +@@ -1,5 +1,6 @@ + /* +- Copyright (C) 1995,96,99,2000,02, 04 Free Software Foundation, Inc. ++ Copyright (C) 1995, 1996, 1999, 2000, 2002, 2004, 2010 ++ Free Software Foundation, Inc. + Written by Miles Bader and Michael I. Bushnell. + + This file is part of the GNU Hurd. +@@ -27,6 +28,9 @@ + #include + #include + #include "fshelp.h" ++#ifdef HAVE_FILE_EXEC_FILE_NAME ++#include ++#endif + + + /* The data passed in the various messages we're interested in. */ +@@ -272,12 +276,22 @@ fshelp_start_translator_long (fshelp_ope + saveport = ports[INIT_PORT_BOOTSTRAP]; + ports[INIT_PORT_BOOTSTRAP] = bootstrap; + ++#ifdef HAVE_FILE_EXEC_FILE_NAME + /* Try and exec the translator in TASK... */ +- err = file_exec (executable, task, EXEC_DEFAULTS, +- argz, argz_len, 0, 0, +- fds, fds_type, fds_len, +- ports, ports_type, ports_len, +- ints, ints_len, 0, 0, 0, 0); ++ err = file_exec_file_name (executable, task, EXEC_DEFAULTS, name, ++ argz, argz_len, 0, 0, ++ fds, fds_type, fds_len, ++ ports, ports_type, ports_len, ++ ints, ints_len, 0, 0, 0, 0); ++ /* For backwards compatibility. Just drop it when we kill file_exec. */ ++ if (err == MIG_BAD_ID) ++#endif ++ err = file_exec (executable, task, EXEC_DEFAULTS, ++ argz, argz_len, 0, 0, ++ fds, fds_type, fds_len, ++ ports, ports_type, ports_len, ++ ints, ints_len, 0, 0, 0, 0); ++ + ports_moved = 1; + + if (ports_type == MACH_MSG_TYPE_COPY_SEND) +Index: hurd-debian/libnetfs/file-exec.c +=================================================================== +--- hurd-debian.orig/libnetfs/file-exec.c ++++ hurd-debian/libnetfs/file-exec.c +@@ -1,5 +1,6 @@ + /* +- Copyright (C) 1996,97,2000,01,02 Free Software Foundation, Inc. ++ Copyright (C) 1996, 1997, 2000, 2001, 2002, 2010 ++ Free Software Foundation, Inc. + Written by Michael I. Bushnell, p/BSG. + + This file is part of the GNU Hurd. +@@ -23,10 +24,14 @@ + #include "netfs.h" + #include "execserver.h" + #include "fs_S.h" ++#include "fs_experimental_S.h" + #include + #include + #include + #include ++#ifdef HAVE_EXEC_EXEC_FILE_NAME ++#include ++#endif + #include + #include + +@@ -49,6 +54,39 @@ netfs_S_file_exec (struct protid *cred, + mach_port_t *destroynames, + size_t destroynameslen) + { ++ return netfs_S_file_exec_file_name (cred, ++ task, ++ flags, ++ "", ++ argv, argvlen, ++ envp, envplen, ++ fds, fdslen, ++ portarray, portarraylen, ++ intarray, intarraylen, ++ deallocnames, deallocnameslen, ++ destroynames, destroynameslen); ++} ++ ++kern_return_t ++netfs_S_file_exec_file_name (struct protid *cred, ++ task_t task, ++ int flags, ++ char *filename, ++ char *argv, ++ size_t argvlen, ++ char *envp, ++ size_t envplen, ++ mach_port_t *fds, ++ size_t fdslen, ++ mach_port_t *portarray, ++ size_t portarraylen, ++ int *intarray, ++ size_t intarraylen, ++ mach_port_t *deallocnames, ++ size_t deallocnameslen, ++ mach_port_t *destroynames, ++ size_t destroynameslen) ++{ + struct node *np; + error_t err; + uid_t uid; +@@ -133,14 +171,31 @@ netfs_S_file_exec (struct protid *cred, + if (newpi) + { + right = ports_get_send_right (newpi); +- err = exec_exec (_netfs_exec, +- right, MACH_MSG_TYPE_COPY_SEND, +- task, flags, argv, argvlen, envp, envplen, +- fds, MACH_MSG_TYPE_COPY_SEND, fdslen, +- portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, +- intarray, intarraylen, +- deallocnames, deallocnameslen, +- destroynames, destroynameslen); ++#ifdef HAVE_EXEC_EXEC_FILE_NAME ++ err = exec_exec_file_name (_netfs_exec, ++ right, MACH_MSG_TYPE_COPY_SEND, ++ task, flags, filename, ++ argv, argvlen, envp, envplen, ++ fds, MACH_MSG_TYPE_COPY_SEND, fdslen, ++ portarray, MACH_MSG_TYPE_COPY_SEND, ++ portarraylen, ++ intarray, intarraylen, ++ deallocnames, deallocnameslen, ++ destroynames, destroynameslen); ++ /* For backwards compatibility. Just drop it when we kill ++ exec_exec. */ ++ if (err == MIG_BAD_ID) ++#endif ++ err = exec_exec (_netfs_exec, ++ right, MACH_MSG_TYPE_COPY_SEND, ++ task, flags, argv, argvlen, envp, envplen, ++ fds, MACH_MSG_TYPE_COPY_SEND, fdslen, ++ portarray, MACH_MSG_TYPE_COPY_SEND, ++ portarraylen, ++ intarray, intarraylen, ++ deallocnames, deallocnameslen, ++ destroynames, destroynameslen); ++ + mach_port_deallocate (mach_task_self (), right); + ports_port_deref (newpi); + } +Index: hurd-debian/libtrivfs/file-exec.c +=================================================================== +--- hurd-debian.orig/libtrivfs/file-exec.c ++++ hurd-debian/libtrivfs/file-exec.c +@@ -1,5 +1,5 @@ + /* +- Copyright (C) 1994,2002 Free Software Foundation, Inc. ++ Copyright (C) 1994, 2002, 2010 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as +@@ -41,3 +41,28 @@ trivfs_S_file_exec (trivfs_protid_t exec + { + return EOPNOTSUPP; + } ++ ++kern_return_t ++trivfs_S_file_exec_file_name (trivfs_protid_t exec_file, ++ mach_port_t reply, ++ mach_msg_type_name_t replyPoly, ++ mach_port_t exec_task, ++ int flags, ++ string_t filename, ++ data_t argv, ++ mach_msg_type_number_t argvCnt, ++ data_t envp, ++ mach_msg_type_number_t envpCnt, ++ portarray_t fdarray, ++ mach_msg_type_number_t fdarrayCnt, ++ portarray_t portarray, ++ mach_msg_type_number_t portarrayCnt, ++ intarray_t intarray, ++ mach_msg_type_number_t intarrayCnt, ++ mach_port_array_t deallocnames, ++ mach_msg_type_number_t deallocnamesCnt, ++ mach_port_array_t destroynames, ++ mach_msg_type_number_t destroynamesCnt) ++{ ++ return EOPNOTSUPP; ++} +Index: hurd-debian/trans/fakeroot.c +=================================================================== +--- hurd-debian.orig/trans/fakeroot.c ++++ hurd-debian/trans/fakeroot.c +@@ -28,10 +28,14 @@ + #include + #include + #include ++#ifdef HAVE_FILE_EXEC_FILE_NAME ++#include ++#endif + + #include + + #include "libnetfs/fs_S.h" ++#include "libnetfs/fs_experimental_S.h" + #include "libnetfs/io_S.h" + #include "libnetfs/fsys_S.h" + #include "libports/notify_S.h" +@@ -785,23 +789,24 @@ netfs_file_get_storage_info (struct ious + } + + kern_return_t +-netfs_S_file_exec (struct protid *user, +- task_t task, +- int flags, +- char *argv, +- size_t argvlen, +- char *envp, +- size_t envplen, +- mach_port_t *fds, +- size_t fdslen, +- mach_port_t *portarray, +- size_t portarraylen, +- int *intarray, +- size_t intarraylen, +- mach_port_t *deallocnames, +- size_t deallocnameslen, +- mach_port_t *destroynames, +- size_t destroynameslen) ++netfs_S_file_exec_file_name (struct protid *user, ++ task_t task, ++ int flags, ++ char *filename, ++ char *argv, ++ size_t argvlen, ++ char *envp, ++ size_t envplen, ++ mach_port_t *fds, ++ size_t fdslen, ++ mach_port_t *portarray, ++ size_t portarraylen, ++ int *intarray, ++ size_t intarraylen, ++ mach_port_t *deallocnames, ++ size_t deallocnameslen, ++ mach_port_t *destroynames, ++ size_t destroynameslen) + { + error_t err; + file_t file; +@@ -820,14 +825,30 @@ netfs_S_file_exec (struct protid *user, + + if (!err) + { ++#ifdef HAVE_FILE_EXEC_FILE_NAME + /* We cannot use MACH_MSG_TYPE_MOVE_SEND because we might need to + retry an interrupted call that would have consumed the rights. */ +- err = file_exec (netfs_node_netnode (user->po->np)->file, +- task, flags, argv, argvlen, +- envp, envplen, fds, MACH_MSG_TYPE_COPY_SEND, fdslen, +- portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, +- intarray, intarraylen, deallocnames, deallocnameslen, +- destroynames, destroynameslen); ++ err = file_exec_file_name (netfs_node_netnode (user->po->np)->file, ++ task, flags, ++ filename, ++ argv, argvlen, ++ envp, envplen, ++ fds, MACH_MSG_TYPE_COPY_SEND, fdslen, ++ portarray, MACH_MSG_TYPE_COPY_SEND, ++ portarraylen, ++ intarray, intarraylen, ++ deallocnames, deallocnameslen, ++ destroynames, destroynameslen); ++ /* For backwards compatibility. Just drop it when we kill ++ file_exec. */ ++ if (err == MIG_BAD_ID) ++#endif ++ err = file_exec (user->po->np->nn->file, task, flags, argv, argvlen, ++ envp, envplen, fds, MACH_MSG_TYPE_COPY_SEND, fdslen, ++ portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, ++ intarray, intarraylen, deallocnames, deallocnameslen, ++ destroynames, destroynameslen); ++ + mach_port_deallocate (mach_task_self (), file); + } + +@@ -843,6 +864,38 @@ netfs_S_file_exec (struct protid *user, + return err; + } + ++kern_return_t ++netfs_S_file_exec (struct protid *user, ++ task_t task, ++ int flags, ++ char *argv, ++ size_t argvlen, ++ char *envp, ++ size_t envplen, ++ mach_port_t *fds, ++ size_t fdslen, ++ mach_port_t *portarray, ++ size_t portarraylen, ++ int *intarray, ++ size_t intarraylen, ++ mach_port_t *deallocnames, ++ size_t deallocnameslen, ++ mach_port_t *destroynames, ++ size_t destroynameslen) ++{ ++ return netfs_S_file_exec_file_name (user, ++ task, ++ flags, ++ "", ++ argv, argvlen, ++ envp, envplen, ++ fds, fdslen, ++ portarray, portarraylen, ++ intarray, intarraylen, ++ deallocnames, deallocnameslen, ++ destroynames, destroynameslen); ++} ++ + error_t + netfs_S_io_map (struct protid *user, + mach_port_t *rdobj, mach_msg_type_name_t *rdobjtype, +@@ -959,6 +1012,7 @@ netfs_demuxer (mach_msg_header_t *inp, + mig_routine_t routine; + if ((routine = netfs_io_server_routine (inp)) || + (routine = netfs_fs_server_routine (inp)) || ++ (routine = netfs_fs_experimental_server_routine (inp)) || + (routine = ports_notify_server_routine (inp)) || + (routine = netfs_fsys_server_routine (inp)) || + /* XXX we should intercept interrupt_operation and do +Index: hurd-debian/utils/login.c +=================================================================== +--- hurd-debian.orig/utils/login.c ++++ hurd-debian/utils/login.c +@@ -1,6 +1,7 @@ + /* Hurdish login + +- Copyright (C) 1995,96,97,98,99,2002 Free Software Foundation, Inc. ++ Copyright (C) 1995, 1996, 1997, 1998, 1999, 2002, 2010 ++ Free Software Foundation, Inc. + + Written by Miles Bader + +@@ -46,6 +47,9 @@ + #include + #include + #include ++#ifdef HAVE_FILE_EXEC_FILE_NAME ++#include ++#endif + #include + + const char *argp_program_version = STANDARD_HURD_VERSION (login); +@@ -882,12 +886,22 @@ main(int argc, char *argv[]) + } + } + +- err = file_exec (exec, mach_task_self (), EXEC_DEFAULTS, +- sh_args, sh_args_len, env, env_len, +- fds, MACH_MSG_TYPE_COPY_SEND, 3, +- ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, +- ints, INIT_INT_MAX, +- 0, 0, 0, 0); ++#ifdef HAVE_FILE_EXEC_FILE_NAME ++ err = file_exec_file_name (exec, mach_task_self (), EXEC_DEFAULTS, shell, ++ sh_args, sh_args_len, env, env_len, ++ fds, MACH_MSG_TYPE_COPY_SEND, 3, ++ ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, ++ ints, INIT_INT_MAX, ++ 0, 0, 0, 0); ++ /* Fallback in case the file server hasn't been restarted. */ ++ if (err == MIG_BAD_ID) ++#endif ++ err = file_exec (exec, mach_task_self (), EXEC_DEFAULTS, ++ sh_args, sh_args_len, env, env_len, ++ fds, MACH_MSG_TYPE_COPY_SEND, 3, ++ ports, MACH_MSG_TYPE_COPY_SEND, INIT_PORT_MAX, ++ ints, INIT_INT_MAX, ++ 0, 0, 0, 0); + if (err) + error(5, err, "%s", shell); + +Index: hurd-debian/hurd/fs_experimental.defs +=================================================================== +--- /dev/null ++++ hurd-debian/hurd/fs_experimental.defs +@@ -0,0 +1,51 @@ ++/* Definitions for the filesystem interface. ++ Copyright (C) 1994,95,96,97,98,99,2002 Free Software Foundation, Inc. ++ ++This file is part of the GNU Hurd. ++ ++The GNU Hurd is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++The GNU Hurd is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with the GNU Hurd; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* All these objects also implement the generic IO facilities. */ ++ ++subsystem fs_experimental 444242; ++ ++#include ++ ++#ifdef FILE_IMPORTS ++FILE_IMPORTS ++#endif ++ ++/* Operations supported on all files */ ++ ++INTR_INTERFACE ++ ++/* Overlay a task with a file. Necessary initialization, including ++ authentication changes associated with set[ug]id execution must be ++ handled by the filesystem. Filesystems normally implement this by ++ using exec_newtask or exec_loadtask as appropriate. */ ++routine file_exec_file_name ( ++ exec_file: file_t; ++ RPT ++ exec_task: task_t; ++ flags: int; ++ filename: string_t; ++ argv: data_t SCP; ++ envp: data_t SCP; ++ fdarray: portarray_t SCP; ++ portarray: portarray_t SCP; ++ intarray: intarray_t SCP; ++ deallocnames: mach_port_name_array_t SCP; ++ destroynames: mach_port_name_array_t SCP); +Index: hurd-debian/libdiskfs/Makefile +=================================================================== +--- hurd-debian.orig/libdiskfs/Makefile ++++ hurd-debian/libdiskfs/Makefile +@@ -56,7 +56,7 @@ OTHERSRCS = conch-fetch.c conch-set.c di + SRCS = $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(IFSOCKSRCS) + installhdrs = diskfs.h diskfs-pager.h + +-MIGSTUBS = fsServer.o ioServer.o fsysServer.o exec_startupServer.o \ ++MIGSTUBS = fsServer.o fs_experimentalServer.o ioServer.o fsysServer.o exec_startupServer.o \ + fsys_replyUser.o fs_notifyUser.o ifsockServer.o \ + startup_notifyServer.o + OBJS = $(sort $(SRCS:.c=.o) $(MIGSTUBS)) +@@ -66,6 +66,7 @@ LDLIBS += -lpthread + + fsys-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h -DREPLY_PORTS + fs-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h ++fs_experimental-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h + io-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h + ifsock-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h + exec_startup-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h +Index: hurd-debian/libdiskfs/demuxer.c +=================================================================== +--- hurd-debian.orig/libdiskfs/demuxer.c ++++ hurd-debian/libdiskfs/demuxer.c +@@ -19,6 +19,7 @@ + + #include "io_S.h" + #include "fs_S.h" ++#include "fs_experimental_S.h" + #include "../libports/notify_S.h" + #include "fsys_S.h" + #include "../libports/interrupt_S.h" +@@ -33,6 +34,7 @@ diskfs_demuxer (mach_msg_header_t *inp, + mig_routine_t routine; + if ((routine = diskfs_io_server_routine (inp)) || + (routine = diskfs_fs_server_routine (inp)) || ++ (routine = diskfs_fs_experimental_server_routine (inp)) || + (routine = ports_notify_server_routine (inp)) || + (routine = diskfs_fsys_server_routine (inp)) || + (routine = ports_interrupt_server_routine (inp)) || +Index: hurd-debian/libnetfs/Makefile +=================================================================== +--- hurd-debian.orig/libnetfs/Makefile ++++ hurd-debian/libnetfs/Makefile +@@ -59,12 +59,13 @@ SRCS= $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $ + + installhdrs=netfs.h + +-MIGSTUBS= ioServer.o fsServer.o fsysServer.o fsys_replyUser.o ifsockServer.o ++MIGSTUBS= ioServer.o fsServer.o fs_experimentalServer.o fsysServer.o fsys_replyUser.o ifsockServer.o + + OBJS=$(sort $(SRCS:.c=.o) $(MIGSTUBS)) + + fsys-MIGSFLAGS = -imacros $(srcdir)/mutations.h -DREPLY_PORTS + fs-MIGSFLAGS = -imacros $(srcdir)/mutations.h ++fs_experimental-MIGSFLAGS = -imacros $(srcdir)/mutations.h + io-MIGSFLAGS = -imacros $(srcdir)/mutations.h + ifsock-MIGSFLAGS = -imacros $(srcdir)/mutations.h + MIGCOMSFLAGS = -prefix netfs_ +Index: hurd-debian/libnetfs/demuxer.c +=================================================================== +--- hurd-debian.orig/libnetfs/demuxer.c ++++ hurd-debian/libnetfs/demuxer.c +@@ -22,6 +22,7 @@ + + #include "io_S.h" + #include "fs_S.h" ++#include "fs_experimental_S.h" + #include "../libports/notify_S.h" + #include "fsys_S.h" + #include "../libports/interrupt_S.h" +@@ -34,6 +35,7 @@ netfs_demuxer (mach_msg_header_t *inp, + mig_routine_t routine; + if ((routine = netfs_io_server_routine (inp)) || + (routine = netfs_fs_server_routine (inp)) || ++ (routine = netfs_fs_experimental_server_routine (inp)) || + (routine = ports_notify_server_routine (inp)) || + (routine = netfs_fsys_server_routine (inp)) || + (routine = ports_interrupt_server_routine (inp)) || +Index: hurd-debian/libtrivfs/Makefile +=================================================================== +--- hurd-debian.orig/libtrivfs/Makefile ++++ hurd-debian/libtrivfs/Makefile +@@ -44,7 +44,7 @@ OTHERSRCS=demuxer.c protid-clean.c proti + + SRCS=$(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(OTHERSRCS) + +-MIGSTUBS=fsServer.o ioServer.o fsysServer.o fsys_replyUser.o ++MIGSTUBS=fsServer.o fs_experimentalServer.o ioServer.o fsysServer.o fsys_replyUser.o + + libname = libtrivfs + HURDLIBS = fshelp iohelp ports shouldbeinlibc +@@ -54,7 +54,7 @@ MIGCOMSFLAGS = -prefix trivfs_ + installhdrs := trivfs.h + mig-sheader-prefix = trivfs_ + ifndef no_deps +-installhdrs += $(patsubst %,trivfs_%_S.h,fs io fsys) ++installhdrs += $(patsubst %,trivfs_%_S.h,fs fs_experimental io fsys) + endif + + include ../Makeconf +Index: hurd-debian/libtrivfs/demuxer.c +=================================================================== +--- hurd-debian.orig/libtrivfs/demuxer.c ++++ hurd-debian/libtrivfs/demuxer.c +@@ -23,6 +23,7 @@ the Free Software Foundation, 675 Mass A + + #include "trivfs_io_S.h" + #include "trivfs_fs_S.h" ++#include "trivfs_fs_experimental_S.h" + #include "../libports/notify_S.h" + #include "trivfs_fsys_S.h" + #include "../libports/interrupt_S.h" +@@ -34,6 +35,7 @@ trivfs_demuxer (mach_msg_header_t *inp, + mig_routine_t routine; + if ((routine = trivfs_io_server_routine (inp)) || + (routine = trivfs_fs_server_routine (inp)) || ++ (routine = trivfs_fs_experimental_server_routine (inp)) || + (routine = ports_notify_server_routine (inp)) || + (routine = trivfs_fsys_server_routine (inp)) || + (routine = ports_interrupt_server_routine (inp))) +Index: hurd-debian/configure.ac +=================================================================== +--- hurd-debian.orig/configure.ac ++++ hurd-debian/configure.ac +@@ -162,6 +162,8 @@ else + VERSIONING=no + fi + AC_SUBST(VERSIONING) ++# Check if libc contains these functions. ++AC_CHECK_FUNCS(file_exec_file_name exec_exec_file_name) + + + # From glibc HEAD, 2007-11-07. diff --git a/debian/patches/exec_filename_use.patch b/debian/patches/exec_filename_use.patch new file mode 100644 index 00000000..bc19a019 --- /dev/null +++ b/debian/patches/exec_filename_use.patch @@ -0,0 +1,111 @@ +From bbce8439190738efc9260490fa52f9dfe9600306 Mon Sep 17 00:00:00 2001 +From: Emilio Pozuelo Monfort +Date: Wed, 26 May 2010 23:32:16 +0200 +Subject: [PATCH 3/3] Use the new _hurd_exec_file_name function + +* configure.in: Check for _hurd_exec_file_name. +* utils/fakeauth.c: Call _hurd_exec_file_name instead of +_hurd_exec if it's available. +* utils/rpctrace.c: Likewise. +* utils/shd.c: Likewise. +--- + configure.in | 4 ++-- + utils/fakeauth.c | 9 +++++++-- + utils/rpctrace.c | 6 +++++- + utils/shd.c | 9 ++++++--- + 4 files changed, 20 insertions(+), 8 deletions(-) + +Index: hurd-debian/configure.ac +=================================================================== +--- hurd-debian.orig/configure.ac ++++ hurd-debian/configure.ac +@@ -163,7 +163,7 @@ else + fi + AC_SUBST(VERSIONING) + # Check if libc contains these functions. +-AC_CHECK_FUNCS(file_exec_file_name exec_exec_file_name) ++AC_CHECK_FUNCS(file_exec_file_name exec_exec_file_name _hurd_exec_file_name) + + + # From glibc HEAD, 2007-11-07. +Index: hurd-debian/utils/fakeauth.c +=================================================================== +--- hurd-debian.orig/utils/fakeauth.c ++++ hurd-debian/utils/fakeauth.c +@@ -1,5 +1,5 @@ + /* fakeauth -- proxy auth server to lie to users about what their IDs are +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2010 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as +@@ -397,7 +397,7 @@ believe it has restricted them to differ + /* We cannot use fork because it doesn't do the right thing with our send + rights that point to our own receive rights, i.e. the new auth port. + Since posix_spawn might be implemented with fork (prior to glibc 2.3), +- we cannot use that simple interface either. We use _hurd_exec ++ we cannot use that simple interface either. We use _hurd_exec_file_name + directly to effect what posix_spawn does in the simple case. */ + { + task_t newtask; +@@ -422,7 +422,12 @@ believe it has restricted them to differ + if (err) + error (3, err, "proc_child"); + ++#ifdef HAVE__HURD_EXEC_FILE_NAME ++ err = _hurd_exec_file_name (newtask, execfile, argv[argi], ++ &argv[argi], environ); ++#else + err = _hurd_exec (newtask, execfile, &argv[argi], environ); ++#endif + mach_port_deallocate (mach_task_self (), newtask); + mach_port_deallocate (mach_task_self (), execfile); + if (err) +Index: hurd-debian/utils/rpctrace.c +=================================================================== +--- hurd-debian.orig/utils/rpctrace.c ++++ hurd-debian/utils/rpctrace.c +@@ -1742,7 +1742,11 @@ traced_spawn (char **argv, char **envp) + /* Now actually run the command they told us to trace. We do the exec on + the actual task, so the RPCs to map in the program itself do not get + traced. Could have an option to use TASK_WRAPPER here instead. */ ++#ifdef HAVE__HURD_EXEC_FILE_NAME ++ err = _hurd_exec_file_name (traced_task, file, *argv, argv, envp); ++#else + err = _hurd_exec (traced_task, file, argv, envp); ++#endif + if (err) + error (2, err, "cannot exec `%s'", argv[0]); + +Index: hurd-debian/utils/shd.c +=================================================================== +--- hurd-debian.orig/utils/shd.c ++++ hurd-debian/utils/shd.c +@@ -1,5 +1,5 @@ + /* +- Copyright (C) 1994,95,99,2002 Free Software Foundation ++ Copyright (C) 1994, 1995, 1999, 2002, 2010 Free Software Foundation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as +@@ -159,15 +159,18 @@ run (char **argv, int fd0, int fd1) + movefd (fd1, 1, &save1)) + return -1; + ++#ifdef HAVE__HURD_EXEC_FILE_NAME ++ err = _hurd_exec_file_name (task, file, program, argv, environ); ++#else + err = _hurd_exec (task, file, argv, environ); +- ++#endif + if (restorefd (fd0, 0, &save0) || + restorefd (fd1, 1, &save1)) + return -1; + + if (err) + { +- error (0, err, "_hurd_exec"); ++ error (0, err, "_hurd_exec_file_name"); + err = task_terminate (task); + if (err) + error (0, err, "task_terminate"); diff --git a/debian/patches/series b/debian/patches/series index 416b258c..ddf7fa73 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -63,5 +63,7 @@ bootshell0007-XXX-bootshell.patch bootshell0008-XXX-proc-fix-build.patch bootshell0009-fixup-more-error-handling.patch bootshell0010-pull-code-from-livecd-XXX-document.patch -fix-console0001-console-client-xkb-kstoucs.c-find_ucs-assert-precond.patch -fix-console0002-console-client-Fix-lower-range-of-binary-search.patch +exec_filename_exec.patch +exec_filename_fs.patch +exec_filename_use.patch +exec_filename_fix.patch -- cgit v1.2.3