From e92bd6e362470aa0a79cfb19a512944f0761184b Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Fri, 18 Nov 2016 16:41:00 -0200 Subject: [PATCH] Fix hurd __access_noerrno implementation. This patch fixes some hurd bits from commit afcf3cd8eb that added the __access_noerrno internal symbol. It basically removes the nonrequired __hurd_fail_noerrno (since the 'err' argument is ignored) and fixes a typo for EACCES. However, as stated on maillist [1] this __access_noerrno may still be unsafe to run during initialization of tunables on the Hurd. The access_common calls __hurd_file_name_lookup, which calls __hurd_file_name_lookup_retry, which can set errno. [1] https://sourceware.org/ml/libc-alpha/2016-11/msg00646.html --- ChangeLog | 8 ++++++++ hurd/hurd.h | 29 ----------------------------- include/unistd.h | 3 ++- sysdeps/mach/hurd/access.c | 8 +++++--- 4 files changed, 15 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4c90aa099e..b923ac9acf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2016-11-18 Adhemerval Zanella + + * hurd/hurd.h (__hurd_fail_noerrno): Remove function. + * include/unistd.h: Extend comment about __access_noerrno return + semantics. + * sysdeps/match/hurd/access.c (__hurd_fail_noerrno): Return -1. + (access_common): Correct typo for EACCES. + 2016-11-18 Chris Metcalf * sysdeps/tile/math-tests.h: New file. diff --git a/hurd/hurd.h b/hurd/hurd.h index c089d4c445..ec0782797d 100644 --- a/hurd/hurd.h +++ b/hurd/hurd.h @@ -75,35 +75,6 @@ __hurd_fail (error_t err) errno = err; return -1; } - -_HURD_H_EXTERN_INLINE int -__hurd_fail_noerrno (error_t err) -{ - switch (err) - { - case EMACH_SEND_INVALID_DEST: - case EMIG_SERVER_DIED: - /* The server has disappeared! */ - err = EIEIO; - break; - - case KERN_NO_SPACE: - err = ENOMEM; - break; - - case KERN_INVALID_ARGUMENT: - err = EINVAL; - break; - - case 0: - return 0; - - default: - break; - } - - return -1; -} /* Basic ports and info, initialized by startup. */ diff --git a/include/unistd.h b/include/unistd.h index 6144f411aa..16d68a1505 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -183,7 +183,8 @@ extern int __getlogin_r_loginuid (char *name, size_t namesize) # if IS_IN (rtld) || !defined SHARED /* __access variant that does not set errno. Used in very early initialization - code in libc.a and ld.so. */ + code in libc.a and ld.so. It follows access return semantics (zero for + sucess otherwise a value different than 0). */ extern __typeof (__access) __access_noerrno attribute_hidden; # endif diff --git a/sysdeps/mach/hurd/access.c b/sysdeps/mach/hurd/access.c index 93e21666f8..0df939a64c 100644 --- a/sysdeps/mach/hurd/access.c +++ b/sysdeps/mach/hurd/access.c @@ -31,7 +31,7 @@ hurd_fail_seterrno (error_t err) static int hurd_fail_noerrno (error_t err) { - return __hurd_fail_noerrno (err); + return -1; } static int @@ -149,13 +149,15 @@ access_common (const char *file, int type, int (*errfunc) (error_t)) if (flags & ~allowed) /* We are not allowed all the requested types of access. */ - return errfunc (EACESS); + return errfunc (EACCES); return 0; } /* Test for access to FILE by our real user and group IDs without setting - errno. */ + errno. This may be unsafe to run during initialization of tunables + since access_common calls __hurd_file_name_lookup, which calls + __hurd_file_name_lookup_retry, which can set errno. */ int __access_noerrno (const char *file, int type) { -- 2.43.5