From a36202019dcc92d5b8058002ba427de3923c6a1c Mon Sep 17 00:00:00 2001 From: Svante Signell Date: Thu, 20 Jan 2022 16:11:44 +0100 Subject: [PATCH] Uncouple nested function calls netfs_make_protid(netfs_make_peropen()) in order to enhance error tracking. --- libnetfs/dir-lookup.c | 80 +++++++++++++++++++++++----------------- libnetfs/dir-mkfile.c | 36 ++++++++++-------- libnetfs/file-exec.c | 63 +++++++++++++++++-------------- libnetfs/file-reparent.c | 25 +++++++++---- libnetfs/fsys-getroot.c | 18 +++++++-- libnetfs/make-peropen.c | 11 +++++- trans/fakeroot.c | 14 +++++-- 7 files changed, 155 insertions(+), 92 deletions(-) Index: hurd-0.9.git20211230/libnetfs/dir-lookup.c =================================================================== --- hurd-0.9.git20211230.orig/libnetfs/dir-lookup.c +++ hurd-0.9.git20211230/libnetfs/dir-lookup.c @@ -48,6 +48,7 @@ netfs_S_dir_lookup (struct protid *dircr char *relpath; error_t err; struct protid *newpi = NULL; + struct peropen *newpo = NULL; struct iouser *user; if (!dircred) @@ -223,13 +224,18 @@ netfs_S_dir_lookup (struct protid *dircr err = iohelp_create_empty_iouser (&user); if (! err) { - newpi = netfs_make_protid (netfs_make_peropen (dnp, 0, - dircred->po), - user); - if (! newpi) - { - err = errno; - iohelp_free_iouser (user); + newpo = netfs_make_peropen (dnp, 0, dircred->po); + if (! newpo) + err = errno; + if (! err) + { + newpi = netfs_make_protid (newpo, user); + if (! newpi) + { + err = errno; + netfs_release_peropen (newpo); + iohelp_free_iouser (user); + } } } @@ -430,36 +436,42 @@ netfs_S_dir_lookup (struct protid *dircr if (err) goto out; - newpi = netfs_make_protid (netfs_make_peropen (np, flags, dircred->po), - user); - if (! newpi) + newpo = netfs_make_peropen (np, flags, dircred->po); + if (! newpo) + err = errno; + if (! err) { - iohelp_free_iouser (user); - err = errno; - goto out; - } + newpi = netfs_make_protid (newpo, user); + if (! newpi) + { + err = errno; + netfs_release_peropen (newpo); + iohelp_free_iouser (user); + goto out; + } - mach_port_t rendezvous = MACH_PORT_NULL; - struct flock64 lock = - { - l_start: 0, - l_len: 0, - l_whence: SEEK_SET - }; + mach_port_t rendezvous = MACH_PORT_NULL; + struct flock64 lock = + { + l_start: 0, + l_len: 0, + l_whence: SEEK_SET + }; - if (flags & O_EXLOCK) - { - lock.l_type = F_WRLCK; - err = fshelp_rlock_tweak (&np->userlock, &np->lock, - &newpi->po->lock_status, flags, 0, 0, - F_SETLK64, &lock, rendezvous); - } - else if (flags & O_SHLOCK) - { - lock.l_type = F_RDLCK; - err = fshelp_rlock_tweak (&np->userlock, &np->lock, - &newpi->po->lock_status, flags, 0, 0, - F_SETLK64, &lock, rendezvous); + if (flags & O_EXLOCK) + { + lock.l_type = F_WRLCK; + err = fshelp_rlock_tweak (&np->userlock, &np->lock, + &newpi->po->lock_status, flags, 0, 0, + F_SETLK64, &lock, rendezvous); + } + else if (flags & O_SHLOCK) + { + lock.l_type = F_RDLCK; + err = fshelp_rlock_tweak (&np->userlock, &np->lock, + &newpi->po->lock_status, flags, 0, 0, + F_SETLK64, &lock, rendezvous); + } } if (! err) Index: hurd-0.9.git20211230/libnetfs/dir-mkfile.c =================================================================== --- hurd-0.9.git20211230.orig/libnetfs/dir-mkfile.c +++ hurd-0.9.git20211230/libnetfs/dir-mkfile.c @@ -1,4 +1,4 @@ -/* +/* Copyright (C) 1995,96,97,2001 Free Software Foundation, Inc. Written by Michael I. Bushnell, p/BSG. @@ -23,13 +23,14 @@ #include "fs_S.h" error_t -netfs_S_dir_mkfile (struct protid *diruser, int flags, mode_t mode, +netfs_S_dir_mkfile (struct protid *diruser, int flags, mode_t mode, mach_port_t *newfile, mach_msg_type_name_t *newfiletype) { error_t err; struct node *np; struct iouser *user; struct protid *newpi; + struct peropen *newpo; pthread_mutex_lock (&diruser->po->np->lock); err = netfs_attempt_mkfile (diruser->user, diruser->po->np, mode, &np); @@ -41,22 +42,27 @@ netfs_S_dir_mkfile (struct protid *dirus err = iohelp_dup_iouser (&user, diruser->user); if (! err) { - newpi = netfs_make_protid (netfs_make_peropen (np, flags, - diruser->po), - user); - if (newpi) + newpo = netfs_make_peropen (np, flags, diruser->po); + if (! newpo) + err = errno; + if (! err) { - *newfile = ports_get_right (newpi); - *newfiletype = MACH_MSG_TYPE_MAKE_SEND; - ports_port_deref (newpi); - } - else - { - err = errno; - iohelp_free_iouser (user); + newpi = netfs_make_protid (newpo,user); + if (newpi) + { + *newfile = ports_get_right (newpi); + *newfiletype = MACH_MSG_TYPE_MAKE_SEND; + ports_port_deref (newpi); + } + else + { + err = errno; + netfs_release_peropen (newpo); + iohelp_free_iouser (user); + } } + netfs_nput (np); } - netfs_nput (np); } return err; Index: hurd-0.9.git20211230/libnetfs/file-exec.c =================================================================== --- hurd-0.9.git20211230.orig/libnetfs/file-exec.c +++ hurd-0.9.git20211230/libnetfs/file-exec.c @@ -160,49 +160,56 @@ netfs_S_file_exec_paths (struct protid * { struct iouser *user; struct protid *newpi; + struct peropen *newpo; err = iohelp_dup_iouser (&user, cred->user); if (! err) { - newpi = netfs_make_protid (netfs_make_peropen (np, O_READ, cred->po), - user); - if (newpi) + newpo = netfs_make_peropen (np, O_READ, cred->po); + if (! newpo) + err = errno; + if (! err) { - right = ports_get_send_right (newpi); - cred_right = ports_get_send_right (cred); + newpi = netfs_make_protid (newpo, user); + if (newpi) + { + right = ports_get_send_right (newpi); + cred_right = ports_get_send_right (cred); #ifdef HAVE_EXEC_EXEC_PATHS - err = exec_exec_paths (_netfs_exec, + err = exec_exec_paths (_netfs_exec, + right, MACH_MSG_TYPE_COPY_SEND, + task, flags, path, abspath, + 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, path, abspath, - argv, argvlen, envp, envplen, + 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); - /* 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); - mach_port_deallocate (mach_task_self (), cred_right); - ports_port_deref (newpi); - } - else - { - err = errno; - iohelp_free_iouser (user); + mach_port_deallocate (mach_task_self (), right); + mach_port_deallocate (mach_task_self (), cred_right); + ports_port_deref (newpi); + } + else + { + err = errno; + netfs_release_peropen (newpo); + iohelp_free_iouser (user); + } } } } Index: hurd-0.9.git20211230/libnetfs/file-reparent.c =================================================================== --- hurd-0.9.git20211230.orig/libnetfs/file-reparent.c +++ hurd-0.9.git20211230/libnetfs/file-reparent.c @@ -11,7 +11,7 @@ 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, + 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. @@ -21,6 +21,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "fs_S.h" +#include error_t netfs_S_file_reparent (struct protid *cred, mach_port_t parent, @@ -29,11 +30,12 @@ netfs_S_file_reparent (struct protid *cr error_t err; struct node *node; struct protid *new_cred; + struct peropen *new_peropen; struct iouser *user; if (! cred) return EOPNOTSUPP; - + err = iohelp_dup_iouser (&user, cred->user); if (err) return err; @@ -41,10 +43,16 @@ netfs_S_file_reparent (struct protid *cr node = cred->po->np; pthread_mutex_lock (&node->lock); - - new_cred = - netfs_make_protid (netfs_make_peropen (node, cred->po->openstat, cred->po), - user); + + new_peropen = netfs_make_peropen (node, cred->po->openstat, cred->po); + if (! new_peropen) + { + err = errno; + pthread_mutex_unlock (&node->lock); + return err; + } + + new_cred = netfs_make_protid (new_peropen, user); pthread_mutex_unlock (&node->lock); if (new_cred) @@ -70,5 +78,8 @@ netfs_S_file_reparent (struct protid *cr return 0; } else - return errno; + { + netfs_release_peropen (new_peropen); + return errno; + } } Index: hurd-0.9.git20211230/libnetfs/fsys-getroot.c =================================================================== --- hurd-0.9.git20211230.orig/libnetfs/fsys-getroot.c +++ hurd-0.9.git20211230/libnetfs/fsys-getroot.c @@ -41,6 +41,7 @@ netfs_S_fsys_getroot (struct netfs_contr struct iouser *cred; error_t err; struct protid *newpi; + struct peropen *newpo; mode_t type; struct peropen peropen_context = { @@ -133,9 +134,20 @@ netfs_S_fsys_getroot (struct netfs_contr flags &= ~OPENONLY_STATE_MODES; - newpi = netfs_make_protid (netfs_make_peropen (netfs_root_node, flags, - &peropen_context), - cred); + newpo = netfs_make_peropen (netfs_root_node, flags, &peropen_context); + if (! newpo) + { + err = errno; + goto out; + } + newpi = netfs_make_protid (newpo, cred); + if (! newpi) + { + err = errno; + netfs_release_peropen (newpo); + goto out; + } + mach_port_deallocate (mach_task_self (), dotdot); *do_retry = FS_RETRY_NORMAL; Index: hurd-0.9.git20211230/libnetfs/make-peropen.c =================================================================== --- hurd-0.9.git20211230.orig/libnetfs/make-peropen.c +++ hurd-0.9.git20211230/libnetfs/make-peropen.c @@ -29,12 +29,18 @@ netfs_make_peropen (struct node *np, int struct peropen *po = malloc (sizeof (struct peropen)); if (!po) - return NULL; + { + errno = ENOMEM; + return NULL; + } po->filepointer = 0; err = fshelp_rlock_po_init (&po->lock_status); if (err) - return NULL; + { + errno = err; + return NULL; + } refcount_init (&po->refcnt, 1); po->openstat = flags; po->np = np; @@ -47,6 +53,7 @@ netfs_make_peropen (struct node *np, int po->path = strdup (context->path); if (! po->path) { free(po); + errno = ENOMEM; return NULL; } } Index: hurd-0.9.git20211230/trans/fakeroot.c =================================================================== --- hurd-0.9.git20211230.orig/trans/fakeroot.c +++ hurd-0.9.git20211230/trans/fakeroot.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -293,6 +294,7 @@ netfs_S_dir_lookup (struct protid *dirus struct node *dnp, *np; error_t err; struct protid *newpi; + struct peropen *newpo; struct iouser *user; mach_port_t file; mach_port_t idport, fsidport; @@ -491,12 +493,18 @@ netfs_S_dir_lookup (struct protid *dirus err = iohelp_dup_iouser (&user, diruser->user); if (!err) { - newpi = netfs_make_protid (netfs_make_peropen (np, flags, diruser->po), - user); + newpo = netfs_make_peropen (np, flags, diruser->po); + if (! newpo) + { + err = errno; + goto lose; + } + newpi = netfs_make_protid (newpo, user); if (! newpi) { - iohelp_free_iouser (user); err = errno; + netfs_release_peropen (newpo); + iohelp_free_iouser (user); } else {