summaryrefslogtreecommitdiff
path: root/debian/patches
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2016-02-08 12:45:22 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2016-02-08 12:45:22 +0100
commit83af5605f5f967bcdff930739607f07b60cddbeb (patch)
tree74dd2c7d5046c4ad585f4a5b7a6858dba143c706 /debian/patches
parent3ffbaab0c4e9a2094a90bc2bd0bc26665388c80e (diff)
add patch series
Diffstat (limited to 'debian/patches')
-rw-r--r--debian/patches/exec_filename0001-Add-a-new-exec_exec_file_name-RPC.patch340
-rw-r--r--debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch1076
-rw-r--r--debian/patches/exec_filename0003-Use-the-new-_hurd_exec_file_name-function.patch114
-rw-r--r--debian/patches/exec_filename0004-This-patch-is-an-amendment-of-exec_filename_exec.pat.patch151
-rw-r--r--debian/patches/series4
5 files changed, 1685 insertions, 0 deletions
diff --git a/debian/patches/exec_filename0001-Add-a-new-exec_exec_file_name-RPC.patch b/debian/patches/exec_filename0001-Add-a-new-exec_exec_file_name-RPC.patch
new file mode 100644
index 00000000..d784f670
--- /dev/null
+++ b/debian/patches/exec_filename0001-Add-a-new-exec_exec_file_name-RPC.patch
@@ -0,0 +1,340 @@
+From ffb7bcee5af49b8248008256791b2e08675a22fa Mon Sep 17 00:00:00 2001
+From: Emilio Pozuelo Monfort <pochu27@gmail.com>
+Date: Wed, 26 May 2010 00:15:37 +0200
+Subject: [PATCH hurd 1/4] 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/Makefile | 3 ++-
+ exec/exec.c | 48 +++++++++++++++++++++++++++++++++++++++++----
+ exec/hashexec.c | 18 +++++++++++------
+ exec/main.c | 2 ++
+ exec/priv.h | 5 ++++-
+ hurd/exec.defs | 4 +++-
+ hurd/exec_experimental.defs | 46 +++++++++++++++++++++++++++++++++++++++++++
+ 8 files changed, 117 insertions(+), 17 deletions(-)
+ create mode 100644 hurd/exec_experimental.defs
+
+diff --git a/doc/hurd.texi b/doc/hurd.texi
+index 525bfa7..7ef2457 100644
+--- a/doc/hurd.texi
++++ b/doc/hurd.texi
+@@ -102,7 +102,7 @@ This file documents the GNU Hurd kernel component. This edition of the
+ 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
+@@ -2758,14 +2758,14 @@ If the setuid/setgid transformation adds a new uid or gid to the user's
+ 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
+diff --git a/exec/Makefile b/exec/Makefile
+index 17d03e3..b531311 100644
+--- a/exec/Makefile
++++ b/exec/Makefile
+@@ -22,7 +22,7 @@ makemode := server
+
+ 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 exec.static
+ HURDLIBS = trivfs fshelp iohelp ports ihash shouldbeinlibc
+@@ -30,6 +30,7 @@ LDLIBS = -lpthread
+
+ exec-MIGSFLAGS = -imacros $(srcdir)/execmutations.h
+ exec_startup-MIGSFLAGS = -imacros $(srcdir)/execmutations.h
++exec_experimental-MIGSFLAGS = -imacros $(srcdir)/execmutations.h
+
+ include ../Makeconf
+
+diff --git a/exec/exec.c b/exec/exec.c
+index 3b63b7f..b825cc5 100644
+--- a/exec/exec.c
++++ b/exec/exec.c
+@@ -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.
+@@ -764,6 +764,7 @@ static error_t
+ 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,
+@@ -822,7 +823,7 @@ do_exec (file_t file,
+ {
+ /* 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,
+@@ -1405,6 +1406,7 @@ do_exec (file_t file,
+ return e.error;
+ }
+
++/* Deprecated. */
+ kern_return_t
+ S_exec_exec (struct trivfs_protid *protid,
+ file_t file,
+@@ -1421,13 +1423,51 @@ S_exec_exec (struct trivfs_protid *protid,
+ 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,
+diff --git a/exec/hashexec.c b/exec/hashexec.c
+index e53d2ee..118360f 100644
+--- a/exec/hashexec.c
++++ b/exec/hashexec.c
+@@ -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 @@ check_hashbang (struct execdata *e,
+ 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 @@ check_hashbang (struct execdata *e,
+ 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 @@ check_hashbang (struct execdata *e,
+ 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),
+diff --git a/exec/main.c b/exec/main.c
+index 2658df5..8929f4c 100644
+--- a/exec/main.c
++++ b/exec/main.c
+@@ -49,6 +49,7 @@ mach_port_t opt_device_master;
+
+
+ #include "exec_S.h"
++#include "exec_experimental_S.h"
+ #include "exec_startup_S.h"
+
+ static int
+@@ -56,6 +57,7 @@ exec_demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp)
+ {
+ 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/exec/priv.h b/exec/priv.h
+index 733f35c..daa7075 100644
+--- a/exec/priv.h
++++ b/exec/priv.h
+@@ -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 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+ #include <link.h> /* This gives us the ElfW macro. */
+ #include <fcntl.h>
+ #include "exec_S.h"
++#include "exec_experimental_S.h"
+
+
+ #ifndef exec_priv_h
+@@ -135,6 +137,7 @@ void check_hashbang (struct execdata *e,
+ 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,
+diff --git a/hurd/exec.defs b/hurd/exec.defs
+index 2888fb1..7433cc2 100644
+--- a/hurd/exec.defs
++++ b/hurd/exec.defs
+@@ -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 @@ EXEC_IMPORTS
+
+ INTR_INTERFACE
+
++/* Deprecated: use exec_exec_file_name instead. */
+ routine exec_exec (
+ execserver: file_t;
+ file: mach_port_send_t;
+diff --git a/hurd/exec_experimental.defs b/hurd/exec_experimental.defs
+new file mode 100644
+index 0000000..ff2e02f
+--- /dev/null
++++ b/hurd/exec_experimental.defs
+@@ -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 <hurd/hurd_types.defs>
++
++#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);
++
+--
+2.1.4
+
diff --git a/debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch b/debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch
new file mode 100644
index 00000000..bc6b5498
--- /dev/null
+++ b/debian/patches/exec_filename0002-Add-a-file_exec_file_name-RPC.patch
@@ -0,0 +1,1076 @@
+From 66ffa0faf232e5d96cefbe7bd5d49d7dece3c4f0 Mon Sep 17 00:00:00 2001
+From: Emilio Pozuelo Monfort <pochu27@gmail.com>
+Date: Wed, 26 May 2010 01:27:40 +0200
+Subject: [PATCH hurd 2/4] 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 +-
+ configure.ac | 2 +
+ doc/hurd.texi | 16 +++---
+ exec/hashexec.c | 37 ++++++++++----
+ hurd/fs.defs | 10 ++--
+ hurd/fs_experimental.defs | 51 +++++++++++++++++++
+ hurd/hurd_types.h | 9 ++--
+ libdiskfs/Makefile | 3 +-
+ libdiskfs/boot-start.c | 2 +-
+ libdiskfs/demuxer.c | 2 +
+ libdiskfs/file-exec.c | 81 +++++++++++++++++++++++++-----
+ libfshelp/start-translator-long.c | 26 +++++++---
+ libnetfs/Makefile | 3 +-
+ libnetfs/demuxer.c | 2 +
+ libnetfs/file-exec.c | 73 ++++++++++++++++++++++++----
+ libtrivfs/Makefile | 6 ++-
+ libtrivfs/demuxer.c | 2 +
+ libtrivfs/file-exec.c | 27 +++++++++-
+ startup/startup.c | 91 +++++++++++++++++++++++++---------
+ trans/fakeroot.c | 100 +++++++++++++++++++++++++++++---------
+ utils/login.c | 28 ++++++++---
+ 21 files changed, 461 insertions(+), 112 deletions(-)
+ create mode 100644 hurd/fs_experimental.defs
+
+diff --git a/TODO b/TODO
+index de2a199..9fdb86f 100644
+--- a/TODO
++++ b/TODO
+@@ -131,7 +131,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. !!
+
+diff --git a/configure.ac b/configure.ac
+index 124eb07..7a0b5df 100644
+--- a/configure.ac
++++ b/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/doc/hurd.texi b/doc/hurd.texi
+index 7ef2457..0f8b88b 100644
+--- a/doc/hurd.texi
++++ b/doc/hurd.texi
+@@ -2729,10 +2729,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}.
+
+@@ -2744,13 +2744,13 @@ The file must be opened for execution; if it is not, @code{EBADF} should
+ 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.
+
+@@ -2765,7 +2765,7 @@ 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_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
+diff --git a/exec/hashexec.c b/exec/hashexec.c
+index 118360f..c971279 100644
+--- a/exec/hashexec.c
++++ b/exec/hashexec.c
+@@ -24,6 +24,9 @@
+ #include <unistd.h>
+ #include <envz.h>
+ #include <sys/param.h>
++#ifdef HAVE_FILE_EXEC_FILE_NAME
++#include <hurd/fs_experimental.h>
++#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);
+
+diff --git a/hurd/fs.defs b/hurd/fs.defs
+index a4a48cc..1322237 100644
+--- a/hurd/fs.defs
++++ b/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;
+diff --git a/hurd/fs_experimental.defs b/hurd/fs_experimental.defs
+new file mode 100644
+index 0000000..761f75a
+--- /dev/null
++++ b/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 <hurd/hurd_types.defs>
++
++#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);
+diff --git a/hurd/hurd_types.h b/hurd/hurd_types.h
+index 4341177..83942a7 100644
+--- a/hurd/hurd_types.h
++++ b/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,
+diff --git a/libdiskfs/Makefile b/libdiskfs/Makefile
+index 803761d..7cdf49e 100644
+--- a/libdiskfs/Makefile
++++ b/libdiskfs/Makefile
+@@ -56,7 +56,7 @@ OTHERSRCS = conch-fetch.c conch-set.c dir-clear.c dir-init.c dir-renamed.c \
+ 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
+diff --git a/libdiskfs/boot-start.c b/libdiskfs/boot-start.c
+index 60bf33d..1d797f1 100644
+--- a/libdiskfs/boot-start.c
++++ b/libdiskfs/boot-start.c
+@@ -198,7 +198,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)
+diff --git a/libdiskfs/demuxer.c b/libdiskfs/demuxer.c
+index 4a1c4fb..ff33b1b 100644
+--- a/libdiskfs/demuxer.c
++++ b/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)) ||
+diff --git a/libdiskfs/file-exec.c b/libdiskfs/file-exec.c
+index e544b14..a491720 100644
+--- a/libdiskfs/file-exec.c
++++ b/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 @@
+
+ #include "priv.h"
+ #include "fs_S.h"
++#include "fs_experimental_S.h"
+ #include <sys/stat.h>
+ #include <fcntl.h>
+ #include <hurd/exec.h>
+ #include <hurd/paths.h>
++#ifdef HAVE_EXEC_EXEC_FILE_NAME
++#include <hurd/exec_experimental.h>
++#endif
+ #include <string.h>
+ #include <idvec.h>
+
+@@ -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)
+ {
+diff --git a/libfshelp/start-translator-long.c b/libfshelp/start-translator-long.c
+index 8b00e08..f0966aa 100644
+--- a/libfshelp/start-translator-long.c
++++ b/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 <string.h>
+ #include <assert.h>
+ #include "fshelp.h"
++#ifdef HAVE_FILE_EXEC_FILE_NAME
++#include <hurd/fs_experimental.h>
++#endif
+
+
+ /* The data passed in the various messages we're interested in. */
+@@ -272,12 +276,22 @@ fshelp_start_translator_long (fshelp_open_fn_t underlying_open_fn,
+ 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)
+diff --git a/libnetfs/Makefile b/libnetfs/Makefile
+index c3830c0..4aade5a 100644
+--- a/libnetfs/Makefile
++++ b/libnetfs/Makefile
+@@ -59,12 +59,13 @@ SRCS= $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(IFSOCKSRCS)
+
+ 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_
+diff --git a/libnetfs/demuxer.c b/libnetfs/demuxer.c
+index 4c20ab6..bf78812 100644
+--- a/libnetfs/demuxer.c
++++ b/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)) ||
+diff --git a/libnetfs/file-exec.c b/libnetfs/file-exec.c
+index 638f0ae..ffaf598 100644
+--- a/libnetfs/file-exec.c
++++ b/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 <sys/stat.h>
+ #include <fcntl.h>
+ #include <hurd/exec.h>
+ #include <hurd/paths.h>
++#ifdef HAVE_EXEC_EXEC_FILE_NAME
++#include <hurd/exec_experimental.h>
++#endif
+ #include <string.h>
+ #include <idvec.h>
+
+@@ -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);
+ }
+diff --git a/libtrivfs/Makefile b/libtrivfs/Makefile
+index 4f9c71f..c3999e3 100644
+--- a/libtrivfs/Makefile
++++ b/libtrivfs/Makefile
+@@ -43,7 +43,7 @@ OTHERSRCS=demuxer.c protid-clean.c protid-dup.c cntl-create.c \
+
+ 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
+@@ -53,6 +53,10 @@ MIGCOMSFLAGS = -prefix trivfs_
+ installhdrs := trivfs.h
+ mig-sheader-prefix = trivfs_
+
++ifndef no_deps
++installhdrs += $(patsubst %,trivfs_%_S.h,fs fs_experimental io fsys)
++endif
++
+ include ../Makeconf
+
+ $(MIGSTUBS:%Server.o=%.sdefsi): $(srcdir)/mig-mutate.h
+diff --git a/libtrivfs/demuxer.c b/libtrivfs/demuxer.c
+index 8c1afe6..55229da 100644
+--- a/libtrivfs/demuxer.c
++++ b/libtrivfs/demuxer.c
+@@ -23,6 +23,7 @@
+
+ #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)))
+diff --git a/libtrivfs/file-exec.c b/libtrivfs/file-exec.c
+index b353d8a..5f873c7 100644
+--- a/libtrivfs/file-exec.c
++++ b/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_file,
+ {
+ 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;
++}
+diff --git a/startup/startup.c b/startup/startup.c
+index 9c45f4b..24ad4e5 100644
+--- a/startup/startup.c
++++ b/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 <hurd.h>
+ #include <hurd/fs.h>
++#ifdef HAVE_FILE_EXEC_FILE_NAME
++#include <hurd/fs_experimental.h>
++#endif
+ #include <hurd/fsys.h>
+ #include <device/device.h>
+ #include <stdio.h>
+@@ -377,13 +380,29 @@ run (const char *server, mach_port_t *ports, task_t *task)
+ printf ("Pausing for %s\n", prog);
+ getchar ();
+ }
+- 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;
+
+@@ -470,14 +489,27 @@ run_for_real (char *filename, char *args, int arglen, mach_port_t ctty,
+ ++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)
+@@ -1075,13 +1107,26 @@ start_child (const char *prog, char **progargs)
+ 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);
+diff --git a/trans/fakeroot.c b/trans/fakeroot.c
+index 84b4efc..9c56452 100644
+--- a/trans/fakeroot.c
++++ b/trans/fakeroot.c
+@@ -28,10 +28,14 @@
+ #include <pthread.h>
+ #include <hurd/ihash.h>
+ #include <hurd/paths.h>
++#ifdef HAVE_FILE_EXEC_FILE_NAME
++#include <hurd/fs_experimental.h>
++#endif
+
+ #include <version.h>
+
+ #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"
+@@ -815,23 +819,24 @@ netfs_file_get_storage_info (struct iouser *cred,
+ }
+
+ 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;
+@@ -850,14 +855,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);
+ }
+
+@@ -873,6 +894,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,
+@@ -989,6 +1042,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
+diff --git a/utils/login.c b/utils/login.c
+index 9ee296a..cc04715 100644
+--- a/utils/login.c
++++ b/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 <miles@gnu.org>
+
+@@ -46,6 +47,9 @@
+ #include <error.h>
+ #include <timefmt.h>
+ #include <hurd/lookup.h>
++#ifdef HAVE_FILE_EXEC_FILE_NAME
++#include <hurd/fs_experimental.h>
++#endif
+ #include <ugids.h>
+
+ 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);
+
+--
+2.1.4
+
diff --git a/debian/patches/exec_filename0003-Use-the-new-_hurd_exec_file_name-function.patch b/debian/patches/exec_filename0003-Use-the-new-_hurd_exec_file_name-function.patch
new file mode 100644
index 00000000..5c6878b0
--- /dev/null
+++ b/debian/patches/exec_filename0003-Use-the-new-_hurd_exec_file_name-function.patch
@@ -0,0 +1,114 @@
+From 92a021bb0b981ec480ad9d75792ee816f2521546 Mon Sep 17 00:00:00 2001
+From: Emilio Pozuelo Monfort <pochu27@gmail.com>
+Date: Wed, 26 May 2010 23:32:16 +0200
+Subject: [PATCH hurd 3/4] 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.ac | 2 +-
+ utils/fakeauth.c | 9 +++++++--
+ utils/rpctrace.c | 4 ++++
+ utils/shd.c | 9 ++++++---
+ 4 files changed, 18 insertions(+), 6 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 7a0b5df..711e12a 100644
+--- a/configure.ac
++++ b/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.
+diff --git a/utils/fakeauth.c b/utils/fakeauth.c
+index 004cc46..3857c5f 100644
+--- a/utils/fakeauth.c
++++ b/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 different identities or no identity at all.\
+ /* 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;
+@@ -426,7 +426,12 @@ believe it has restricted them to different identities or no identity at all.\
+ 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)
+diff --git a/utils/rpctrace.c b/utils/rpctrace.c
+index 276377c..b2f7b2b 100644
+--- a/utils/rpctrace.c
++++ b/utils/rpctrace.c
+@@ -1660,7 +1660,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]);
+
+diff --git a/utils/shd.c b/utils/shd.c
+index feff613..9ecab26 100644
+--- a/utils/shd.c
++++ b/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
+@@ -160,15 +160,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");
+--
+2.1.4
+
diff --git a/debian/patches/exec_filename0004-This-patch-is-an-amendment-of-exec_filename_exec.pat.patch b/debian/patches/exec_filename0004-This-patch-is-an-amendment-of-exec_filename_exec.pat.patch
new file mode 100644
index 00000000..290aac47
--- /dev/null
+++ b/debian/patches/exec_filename0004-This-patch-is-an-amendment-of-exec_filename_exec.pat.patch
@@ -0,0 +1,151 @@
+From f011579ac300620fe6e513c92080cf5e576d5e87 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Sun, 13 Sep 2015 14:06:59 +0200
+Subject: [PATCH hurd 4/4] 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 | 93 +++++++++++++++++++++++++++++++--------------------------
+ 1 file changed, 51 insertions(+), 42 deletions(-)
+
+diff --git a/exec/hashexec.c b/exec/hashexec.c
+index c971279..c2eda5b 100644
+--- 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)
+--
+2.1.4
+
diff --git a/debian/patches/series b/debian/patches/series
index ed4ba87f..23dab427 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -32,3 +32,7 @@ translators-list0003-libfshelp-improve-translator-list.patch
translators-list0004-add-iteration.patch
nodeihash0001-xxx-fix-node-iteration.patch
gpg0001-trans-add-transparent-GnuPG-translator.patch
+exec_filename0001-Add-a-new-exec_exec_file_name-RPC.patch
+exec_filename0002-Add-a-file_exec_file_name-RPC.patch
+exec_filename0003-Use-the-new-_hurd_exec_file_name-function.patch
+exec_filename0004-This-patch-is-an-amendment-of-exec_filename_exec.pat.patch