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 2012-06-03 20:17:54.000000000 +0000 +++ hurd-debian/doc/hurd.texi 2012-06-05 04:32:07.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 @@ -2770,14 +2770,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 2012-06-03 17:08:36.000000000 +0000 +++ hurd-debian/exec/exec.c 2012-06-05 04:19:51.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. @@ -1357,6 +1357,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, @@ -1452,7 +1453,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, @@ -2055,6 +2056,7 @@ return e.error; } +/* Deprecated. */ kern_return_t S_exec_exec (struct trivfs_protid *protid, file_t file, @@ -2071,6 +2073,44 @@ 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; @@ -2158,7 +2198,7 @@ /* 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 2012-06-03 17:08:36.000000000 +0000 +++ hurd-debian/exec/hashexec.c 2012-06-05 04:32:38.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 2012-06-03 17:08:36.000000000 +0000 +++ hurd-debian/exec/priv.h 2012-06-05 03:36: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. @@ -36,6 +37,7 @@ #include /* This gives us the ElfW macro. */ #include #include "exec_S.h" +#include "exec_experimental_S.h" #ifndef exec_priv_h @@ -171,6 +173,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 2012-06-03 17:08:36.000000000 +0000 +++ hurd-debian/hurd/exec.defs 2012-06-03 20:17:55.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 2012-06-03 20:17:55.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 2012-06-03 17:08:36.000000000 +0000 +++ hurd-debian/exec/Makefile 2012-06-05 03:39:06.000000000 +0000 @@ -23,7 +23,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 @@ -37,6 +37,7 @@ OTHERLIBS = -lpthread exec-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 2012-06-03 17:08:36.000000000 +0000 +++ hurd-debian/exec/main.c 2012-06-05 01:28:09.000000000 +0000 @@ -58,9 +58,11 @@ exec_demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp) { extern int exec_server (mach_msg_header_t *inp, mach_msg_header_t *outp); + extern int exec_experimental_server (mach_msg_header_t *inp, mach_msg_header_t *outp); extern int exec_startup_server (mach_msg_header_t *, mach_msg_header_t *); return (exec_startup_server (inp, outp) || exec_server (inp, outp) || + exec_experimental_server (inp, outp) || trivfs_demuxer (inp, outp)); }