>From d322e644ffb231de7ac37f4951fc9bb091b1e6d7 Mon Sep 17 00:00:00 2001 From: Emilio Pozuelo Monfort Date: Sat, 22 May 2010 17:46:56 +0200 Subject: [PATCH 4/4] Add a file_exec_file_name RPC Make file_exec call file_exec_file_name and deprecate file_exec. --- hurd/fs.defs | 21 ++++++++++++++++++- libdiskfs/file-exec.c | 52 +++++++++++++++++++++++++++++++++++++++++------- libnetfs/file-exec.c | 51 ++++++++++++++++++++++++++++++++++++++++------- libtreefs/s-file.c | 22 ++++++++++++++++++++ libtrivfs/file-exec.c | 26 ++++++++++++++++++++++++ trans/fakeroot.c | 48 ++++++++++++++++++++++++++++++++++++++++---- 6 files changed, 198 insertions(+), 22 deletions(-) diff --git a/hurd/fs.defs b/hurd/fs.defs index 52d83bd..6f6202e 100644 --- a/hurd/fs.defs +++ b/hurd/fs.defs @@ -35,7 +35,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 @@ -352,3 +353,21 @@ routine file_reparent ( RPT parent: mach_port_t; out new_file: mach_port_send_t); + +/* 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: data_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/libdiskfs/file-exec.c b/libdiskfs/file-exec.c index 452240c..511a8c2 100644 --- a/libdiskfs/file-exec.c +++ b/libdiskfs/file-exec.c @@ -47,6 +47,41 @@ diskfs_S_file_exec (struct protid *cred, mach_port_t *destroynames, size_t destroynameslen) { + return diskfs_S_file_exec_file_name ( + cred, + task, + flags, + NULL, 0, + 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, + size_t filenamelen, + 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; @@ -159,14 +194,15 @@ 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); + err = exec_exec_file_name (execserver, + right, MACH_MSG_TYPE_COPY_SEND, + task, flags, filename, filenamelen, + 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/libnetfs/file-exec.c b/libnetfs/file-exec.c index 73c125b..364344b 100644 --- a/libnetfs/file-exec.c +++ b/libnetfs/file-exec.c @@ -49,6 +49,40 @@ netfs_S_file_exec (struct protid *cred, mach_port_t *destroynames, size_t destroynameslen) { + return netfs_S_file_exec_file_name (cred, + task, + flags, + NULL, 0, + 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, + size_t filenamelen, + 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 +167,15 @@ 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); + err = exec_exec_file_name (_netfs_exec, + right, MACH_MSG_TYPE_COPY_SEND, + task, flags, filename, filenamelen, + 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/libtreefs/s-file.c b/libtreefs/s-file.c index 73c32d7..2f6cedd 100644 --- a/libtreefs/s-file.c +++ b/libtreefs/s-file.c @@ -93,6 +93,28 @@ treefs_S_file_exec (struct treefs_protid *cred, } error_t +treefs_S_file_exec_file_name (struct treefs_protid *cred, + task_t task, int flags, + char *filename, unsigned filename_len, + char *argv, unsigned argv_len, + char *envp, unsigned envp_len, + mach_port_t *fds, unsigned fds_len, + mach_port_t *ports, unsigned ports_len, + int *ints, unsigned ints_len, + mach_port_t *dealloc, unsigned dealloc_len, + mach_port_t *destroy, unsigned destroy_len) +{ + if (!cred) + return EOPNOTSUPP; + /* XXX We're ignoring filename, so this is the same as if the caller would + have called file_exec instead of file_exec_file_name. */ + return treefs_s_file_exec (cred, task, flags, argv, argv_len, envp, envp_len, + fds, fds_len, ports, ports_len, ints, ints_len, + dealloc, dealloc_len, destroy, destroy_len); + +} + +error_t treefs_S_file_get_translator (struct treefs_protid *cred, char **trans, unsigned *trans_len) { diff --git a/libtrivfs/file-exec.c b/libtrivfs/file-exec.c index a3ab048..a321f05 100644 --- a/libtrivfs/file-exec.c +++ b/libtrivfs/file-exec.c @@ -40,3 +40,29 @@ 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, + data_t filename, + mach_msg_type_number_t filenameCnt, + 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/trans/fakeroot.c b/trans/fakeroot.c index c110234..acb980b 100644 --- a/trans/fakeroot.c +++ b/trans/fakeroot.c @@ -705,6 +705,40 @@ netfs_S_file_exec (struct protid *user, mach_port_t *destroynames, size_t destroynameslen) { + return netfs_S_file_exec_file_name (user, + task, + flags, + NULL, 0, + 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 *user, + task_t task, + int flags, + char *filename, + size_t filenamelen, + 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; @@ -723,11 +757,15 @@ netfs_S_file_exec (struct protid *user, { /* 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 (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); + err = file_exec_file_name (user->po->np->nn->file, task, flags, + filename, filenamelen, + 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); } -- 1.7.1