Message ID | CAMe9rOqQL07x-QBAHhgiGZh=s98LJ35Mrec4QKfV18SohnRQnA@mail.gmail.com |
---|---|
State | New, archived |
Headers |
Received: (qmail 124098 invoked by alias); 19 Jul 2017 21:53:38 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: <libc-alpha.sourceware.org> List-Unsubscribe: <mailto:libc-alpha-unsubscribe-##L=##H@sourceware.org> List-Subscribe: <mailto:libc-alpha-subscribe@sourceware.org> List-Archive: <http://sourceware.org/ml/libc-alpha/> List-Post: <mailto:libc-alpha@sourceware.org> List-Help: <mailto:libc-alpha-help@sourceware.org>, <http://sourceware.org/ml/#faqs> Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 124082 invoked by uid 89); 19 Jul 2017 21:53:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-oi0-f68.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=DRhKcowui2LIWgsufly3YfmNIfgG2xawyDsdpATFC4c=; b=ujAaeRO2e5AAbYL64EK2oJArXyY3s/OUXDf6pqjKIconZQMIcGRTn/Ss7Bo14Yhccw TKq51EmbouXxtyAnlmFBpmMboogeN30tPKtlx/2venvYcTq+0cIP5KBw9/vwihnM/x8M 1k10Uc+oEaadulnhVOtTCNfQaJLOnQsjpAAsniP18g91r0UPg9Lmym+tX5siiIZ3WBZu c9r082nAKmzGn1yhIuXw2MfKBaY9M2gkmAyWc5iM4hUPUnOzb5Ow2APiPtwDZdE5HpHG qD7SrDjTMA/4SpW+LRZU8UxJCt9aAIdLT9sXhKuifiW3cicH8YML5AchfxUVLZsD+jN0 Ab1g== X-Gm-Message-State: AIVw111PDMLWqk4CPxg94TGhb3Rv5xQJrjnhCM/9HXLtNWb0mQPc/BfE 6sSTGq56nIXF28ZK2y9fAAVVOayVUQ== X-Received: by 10.202.53.215 with SMTP id c206mr3354371oia.164.1500501213891; Wed, 19 Jul 2017 14:53:33 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <80b843b8-6e3c-ccbe-5a6f-b37e18dbdbae@linaro.org> References: <20170716191924.GA7226@gmail.com> <7643d65d-839e-a85d-8a4f-30eada595887@linaro.org> <CAMe9rOrU5Wp=bZgOY=91dyEJHjW6SJ5HknOeS_92pTxukpFrhA@mail.gmail.com> <874luag5n4.fsf@mid.deneb.enyo.de> <6dc48782-60c3-cead-08c0-7e018e7eb9ef@linaro.org> <cf2078d9-665e-c77d-36ad-29285719ff86@linaro.org> <CAMe9rOpBEe7FZfnWfRCpvyJ5MYGjm8UVdNFti8S9uiFbzZkmZg@mail.gmail.com> <80b843b8-6e3c-ccbe-5a6f-b37e18dbdbae@linaro.org> From: "H.J. Lu" <hjl.tools@gmail.com> Date: Wed, 19 Jul 2017 14:53:33 -0700 Message-ID: <CAMe9rOqQL07x-QBAHhgiGZh=s98LJ35Mrec4QKfV18SohnRQnA@mail.gmail.com> Subject: Re: [PATCH] Don't all __access_noerrno with stack protector from __tunables_init [BZ #21744] To: Adhemerval Zanella <adhemerval.zanella@linaro.org> Cc: Florian Weimer <fw@deneb.enyo.de>, GNU C Library <libc-alpha@sourceware.org> Content-Type: text/plain; charset="UTF-8" |
Commit Message
H.J. Lu
July 19, 2017, 9:53 p.m. UTC
On Tue, Jul 18, 2017 at 6:52 AM, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > > > On 18/07/2017 10:44, H.J. Lu wrote: >> This should work for Linux. >> >> Thanks. >> > > Now with a proper patch: > > [PATCH] tunables: Use direct syscall for access (BZ#21744) > > The function maybe_enable_malloc_check, which is called by > __tunables_init, calls __access_noerrno. It isn't problem when > symbol is is in ld.so, which has a special version of __access_noerrno > without stack protector. But when glibc is built with stack protector, > maybe_enable_malloc_check in libc.a can't call the regular version of > __access_noerrno with stack protector. > > This patch changes how Linux defines the __access_noerrno to be an > inline call instead and thus preventing defining different build > rules for ld/static and shared. > > H.J. Lu <hongjiu.lu@intel.com> > Adhemerval Zanella <adhemerval.zanella@linaro.org> Missing [BZ#21744] > * elf/dl-tunables.c: Include not-errno.h header. > * include/unistd.h (__access_noerrno): Remove definition. > * sysdeps/unix/sysv/linux/access.c (__access_noerrno): Likewise. > * sysdeps/generic/not-errno.h: New file. > * sysdeps/unix/sysv/linux/not-errno.h: Likewise. > --- > ChangeLog | 9 +++++++++ > elf/dl-tunables.c | 2 ++ > include/unistd.h | 7 ------- > sysdeps/generic/not-errno.h | 19 +++++++++++++++++++ > sysdeps/unix/sysv/linux/access.c | 15 --------------- > sysdeps/unix/sysv/linux/not-errno.h | 30 ++++++++++++++++++++++++++++++ > 6 files changed, 60 insertions(+), 22 deletions(-) > create mode 100644 sysdeps/generic/not-errno.h > create mode 100644 sysdeps/unix/sysv/linux/not-errno.h > > diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c > index 44c160c..231fb8c 100644 > --- a/elf/dl-tunables.c > +++ b/elf/dl-tunables.c > @@ -29,6 +29,8 @@ > #define TUNABLES_INTERNAL 1 > #include "dl-tunables.h" > > +#include <not-errno.h> > + > #if TUNABLES_FRONTEND == TUNABLES_FRONTEND_valstring > # define GLIBC_TUNABLES "GLIBC_TUNABLES" > #endif > diff --git a/include/unistd.h b/include/unistd.h > index 5b2a414..7f1c2cc 100644 > --- a/include/unistd.h > +++ b/include/unistd.h > @@ -182,12 +182,5 @@ extern int __getlogin_r_loginuid (char *name, size_t namesize) > # include <dl-unistd.h> > # endif > > -# 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. It follows access return semantics (zero for > - sucess otherwise a value different than 0). */ > -extern __typeof (__access) __access_noerrno attribute_hidden; > -# endif > - > # endif > #endif > diff --git a/sysdeps/generic/not-errno.h b/sysdeps/generic/not-errno.h > new file mode 100644 > index 0000000..2aac095 > --- /dev/null > +++ b/sysdeps/generic/not-errno.h > @@ -0,0 +1,19 @@ > +/* Syscall wrapper that do not set errno. Generic version. > + Copyright (C) 2017 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <http://www.gnu.org/licenses/>. */ > + > +extern __typeof (__access) __access_noerrno attribute_hidden; > diff --git a/sysdeps/unix/sysv/linux/access.c b/sysdeps/unix/sysv/linux/access.c > index 67e69bd..366b6b6 100644 > --- a/sysdeps/unix/sysv/linux/access.c > +++ b/sysdeps/unix/sysv/linux/access.c > @@ -21,21 +21,6 @@ > #include <sysdep-cancel.h> > > int > -__access_noerrno (const char *file, int type) > -{ > - int res; > - INTERNAL_SYSCALL_DECL (err); > -#ifdef __NR_access > - res = INTERNAL_SYSCALL_CALL (access, err, file, type); > -#else > - res = INTERNAL_SYSCALL_CALL (faccessat, err, AT_FDCWD, file, type); > -#endif > - if (INTERNAL_SYSCALL_ERROR_P (res, err)) > - return INTERNAL_SYSCALL_ERRNO (res, err); > - return 0; > -} > - > -int > __access (const char *file, int type) > { > #ifdef __NR_access > diff --git a/sysdeps/unix/sysv/linux/not-errno.h b/sysdeps/unix/sysv/linux/not-errno.h > new file mode 100644 > index 0000000..4957038 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/not-errno.h > @@ -0,0 +1,30 @@ > +/* Syscall wrapper that do not set errno. Linux version. > + Copyright (C) 2017 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <http://www.gnu.org/licenses/>. */ > + > +/* This function is used on maybe_enable_malloc_check (elf/dl-tunables.c) > + and to avoid having to build/use multiple versions if stack protection > + in enabled it is defined as inline. */ > +static inline int > +__access_noerrno (const char *pathname, int mode) > +{ > +#ifdef __NR_access > + return INTERNAL_SYSCALL_CALL (access, pathname, mode); > +#else > + return INTERNAL_SYSCALL_CALL (faccessat, AT_FDCWD, file, type); > +#endif > +} These are wrong. INTERNAL_SYSCALL_CALL needs a dummy err. This seems to work:
Comments
On 19/07/2017 18:53, H.J. Lu wrote: > On Tue, Jul 18, 2017 at 6:52 AM, Adhemerval Zanella > <adhemerval.zanella@linaro.org> wrote: >> >> >> On 18/07/2017 10:44, H.J. Lu wrote: >>> This should work for Linux. >>> >>> Thanks. >>> >> >> Now with a proper patch: >> >> [PATCH] tunables: Use direct syscall for access (BZ#21744) >> >> The function maybe_enable_malloc_check, which is called by >> __tunables_init, calls __access_noerrno. It isn't problem when >> symbol is is in ld.so, which has a special version of __access_noerrno >> without stack protector. But when glibc is built with stack protector, >> maybe_enable_malloc_check in libc.a can't call the regular version of >> __access_noerrno with stack protector. >> >> This patch changes how Linux defines the __access_noerrno to be an >> inline call instead and thus preventing defining different build >> rules for ld/static and shared. >> >> H.J. Lu <hongjiu.lu@intel.com> >> Adhemerval Zanella <adhemerval.zanella@linaro.org> > > Missing [BZ#21744] Ack. > >> * elf/dl-tunables.c: Include not-errno.h header. >> * include/unistd.h (__access_noerrno): Remove definition. >> * sysdeps/unix/sysv/linux/access.c (__access_noerrno): Likewise. >> * sysdeps/generic/not-errno.h: New file. >> * sysdeps/unix/sysv/linux/not-errno.h: Likewise. >> --- >> ChangeLog | 9 +++++++++ >> elf/dl-tunables.c | 2 ++ >> include/unistd.h | 7 ------- >> sysdeps/generic/not-errno.h | 19 +++++++++++++++++++ >> sysdeps/unix/sysv/linux/access.c | 15 --------------- >> sysdeps/unix/sysv/linux/not-errno.h | 30 ++++++++++++++++++++++++++++++ >> 6 files changed, 60 insertions(+), 22 deletions(-) >> create mode 100644 sysdeps/generic/not-errno.h >> create mode 100644 sysdeps/unix/sysv/linux/not-errno.h >> >> diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c >> index 44c160c..231fb8c 100644 >> --- a/elf/dl-tunables.c >> +++ b/elf/dl-tunables.c >> @@ -29,6 +29,8 @@ >> #define TUNABLES_INTERNAL 1 >> #include "dl-tunables.h" >> >> +#include <not-errno.h> >> + >> #if TUNABLES_FRONTEND == TUNABLES_FRONTEND_valstring >> # define GLIBC_TUNABLES "GLIBC_TUNABLES" >> #endif >> diff --git a/include/unistd.h b/include/unistd.h >> index 5b2a414..7f1c2cc 100644 >> --- a/include/unistd.h >> +++ b/include/unistd.h >> @@ -182,12 +182,5 @@ extern int __getlogin_r_loginuid (char *name, size_t namesize) >> # include <dl-unistd.h> >> # endif >> >> -# 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. It follows access return semantics (zero for >> - sucess otherwise a value different than 0). */ >> -extern __typeof (__access) __access_noerrno attribute_hidden; >> -# endif >> - >> # endif >> #endif >> diff --git a/sysdeps/generic/not-errno.h b/sysdeps/generic/not-errno.h >> new file mode 100644 >> index 0000000..2aac095 >> --- /dev/null >> +++ b/sysdeps/generic/not-errno.h >> @@ -0,0 +1,19 @@ >> +/* Syscall wrapper that do not set errno. Generic version. >> + Copyright (C) 2017 Free Software Foundation, Inc. >> + This file is part of the GNU C Library. >> + >> + The GNU C Library is free software; you can redistribute it and/or >> + modify it under the terms of the GNU Lesser General Public >> + License as published by the Free Software Foundation; either >> + version 2.1 of the License, or (at your option) any later version. >> + >> + The GNU C Library 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 >> + Lesser General Public License for more details. >> + >> + You should have received a copy of the GNU Lesser General Public >> + License along with the GNU C Library; if not, see >> + <http://www.gnu.org/licenses/>. */ >> + >> +extern __typeof (__access) __access_noerrno attribute_hidden; >> diff --git a/sysdeps/unix/sysv/linux/access.c b/sysdeps/unix/sysv/linux/access.c >> index 67e69bd..366b6b6 100644 >> --- a/sysdeps/unix/sysv/linux/access.c >> +++ b/sysdeps/unix/sysv/linux/access.c >> @@ -21,21 +21,6 @@ >> #include <sysdep-cancel.h> >> >> int >> -__access_noerrno (const char *file, int type) >> -{ >> - int res; >> - INTERNAL_SYSCALL_DECL (err); >> -#ifdef __NR_access >> - res = INTERNAL_SYSCALL_CALL (access, err, file, type); >> -#else >> - res = INTERNAL_SYSCALL_CALL (faccessat, err, AT_FDCWD, file, type); >> -#endif >> - if (INTERNAL_SYSCALL_ERROR_P (res, err)) >> - return INTERNAL_SYSCALL_ERRNO (res, err); >> - return 0; >> -} >> - >> -int >> __access (const char *file, int type) >> { >> #ifdef __NR_access >> diff --git a/sysdeps/unix/sysv/linux/not-errno.h b/sysdeps/unix/sysv/linux/not-errno.h >> new file mode 100644 >> index 0000000..4957038 >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/not-errno.h >> @@ -0,0 +1,30 @@ >> +/* Syscall wrapper that do not set errno. Linux version. >> + Copyright (C) 2017 Free Software Foundation, Inc. >> + This file is part of the GNU C Library. >> + >> + The GNU C Library is free software; you can redistribute it and/or >> + modify it under the terms of the GNU Lesser General Public >> + License as published by the Free Software Foundation; either >> + version 2.1 of the License, or (at your option) any later version. >> + >> + The GNU C Library 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 >> + Lesser General Public License for more details. >> + >> + You should have received a copy of the GNU Lesser General Public >> + License along with the GNU C Library; if not, see >> + <http://www.gnu.org/licenses/>. */ >> + >> +/* This function is used on maybe_enable_malloc_check (elf/dl-tunables.c) >> + and to avoid having to build/use multiple versions if stack protection >> + in enabled it is defined as inline. */ >> +static inline int >> +__access_noerrno (const char *pathname, int mode) >> +{ >> +#ifdef __NR_access >> + return INTERNAL_SYSCALL_CALL (access, pathname, mode); >> +#else >> + return INTERNAL_SYSCALL_CALL (faccessat, AT_FDCWD, file, type); >> +#endif >> +} > > These are wrong. INTERNAL_SYSCALL_CALL needs a dummy err. > This seems to work: > > diff --git a/sysdeps/unix/sysv/linux/not-errno.h > b/sysdeps/unix/sysv/linux/not-errno.h > index 4957038160..a03c399f95 100644 > --- a/sysdeps/unix/sysv/linux/not-errno.h > +++ b/sysdeps/unix/sysv/linux/not-errno.h > @@ -23,8 +23,8 @@ static inline int > __access_noerrno (const char *pathname, int mode) > { > #ifdef __NR_access > - return INTERNAL_SYSCALL_CALL (access, pathname, mode); > + return INTERNAL_SYSCALL_CALL (access, err, pathname, mode); > #else > - return INTERNAL_SYSCALL_CALL (faccessat, AT_FDCWD, file, type); > + return INTERNAL_SYSCALL_CALL (faccessat, err, AT_FDCWD, file, type); > #endif > } > Right, so we will need the 'INTERNAL_SYSCALL_DECL (err);' before as well.
On Wed, Jul 19, 2017 at 5:56 PM, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > > > On 19/07/2017 18:53, H.J. Lu wrote: >> On Tue, Jul 18, 2017 at 6:52 AM, Adhemerval Zanella >> <adhemerval.zanella@linaro.org> wrote: >>> >>> >>> On 18/07/2017 10:44, H.J. Lu wrote: >>>> This should work for Linux. >>>> >>>> Thanks. >>>> >>> >>> Now with a proper patch: >>> >>> [PATCH] tunables: Use direct syscall for access (BZ#21744) >>> >>> The function maybe_enable_malloc_check, which is called by >>> __tunables_init, calls __access_noerrno. It isn't problem when >>> symbol is is in ld.so, which has a special version of __access_noerrno >>> without stack protector. But when glibc is built with stack protector, >>> maybe_enable_malloc_check in libc.a can't call the regular version of >>> __access_noerrno with stack protector. >>> >>> This patch changes how Linux defines the __access_noerrno to be an >>> inline call instead and thus preventing defining different build >>> rules for ld/static and shared. >>> >>> H.J. Lu <hongjiu.lu@intel.com> >>> Adhemerval Zanella <adhemerval.zanella@linaro.org> >> >> Missing [BZ#21744] > > Ack. > >> >>> * elf/dl-tunables.c: Include not-errno.h header. >>> * include/unistd.h (__access_noerrno): Remove definition. >>> * sysdeps/unix/sysv/linux/access.c (__access_noerrno): Likewise. >>> * sysdeps/generic/not-errno.h: New file. >>> * sysdeps/unix/sysv/linux/not-errno.h: Likewise. >>> --- >>> ChangeLog | 9 +++++++++ >>> elf/dl-tunables.c | 2 ++ >>> include/unistd.h | 7 ------- >>> sysdeps/generic/not-errno.h | 19 +++++++++++++++++++ >>> sysdeps/unix/sysv/linux/access.c | 15 --------------- >>> sysdeps/unix/sysv/linux/not-errno.h | 30 ++++++++++++++++++++++++++++++ >>> 6 files changed, 60 insertions(+), 22 deletions(-) >>> create mode 100644 sysdeps/generic/not-errno.h >>> create mode 100644 sysdeps/unix/sysv/linux/not-errno.h >>> >>> diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c >>> index 44c160c..231fb8c 100644 >>> --- a/elf/dl-tunables.c >>> +++ b/elf/dl-tunables.c >>> @@ -29,6 +29,8 @@ >>> #define TUNABLES_INTERNAL 1 >>> #include "dl-tunables.h" >>> >>> +#include <not-errno.h> >>> + >>> #if TUNABLES_FRONTEND == TUNABLES_FRONTEND_valstring >>> # define GLIBC_TUNABLES "GLIBC_TUNABLES" >>> #endif >>> diff --git a/include/unistd.h b/include/unistd.h >>> index 5b2a414..7f1c2cc 100644 >>> --- a/include/unistd.h >>> +++ b/include/unistd.h >>> @@ -182,12 +182,5 @@ extern int __getlogin_r_loginuid (char *name, size_t namesize) >>> # include <dl-unistd.h> >>> # endif >>> >>> -# 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. It follows access return semantics (zero for >>> - sucess otherwise a value different than 0). */ >>> -extern __typeof (__access) __access_noerrno attribute_hidden; >>> -# endif >>> - >>> # endif >>> #endif >>> diff --git a/sysdeps/generic/not-errno.h b/sysdeps/generic/not-errno.h >>> new file mode 100644 >>> index 0000000..2aac095 >>> --- /dev/null >>> +++ b/sysdeps/generic/not-errno.h >>> @@ -0,0 +1,19 @@ >>> +/* Syscall wrapper that do not set errno. Generic version. >>> + Copyright (C) 2017 Free Software Foundation, Inc. >>> + This file is part of the GNU C Library. >>> + >>> + The GNU C Library is free software; you can redistribute it and/or >>> + modify it under the terms of the GNU Lesser General Public >>> + License as published by the Free Software Foundation; either >>> + version 2.1 of the License, or (at your option) any later version. >>> + >>> + The GNU C Library 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 >>> + Lesser General Public License for more details. >>> + >>> + You should have received a copy of the GNU Lesser General Public >>> + License along with the GNU C Library; if not, see >>> + <http://www.gnu.org/licenses/>. */ >>> + >>> +extern __typeof (__access) __access_noerrno attribute_hidden; >>> diff --git a/sysdeps/unix/sysv/linux/access.c b/sysdeps/unix/sysv/linux/access.c >>> index 67e69bd..366b6b6 100644 >>> --- a/sysdeps/unix/sysv/linux/access.c >>> +++ b/sysdeps/unix/sysv/linux/access.c >>> @@ -21,21 +21,6 @@ >>> #include <sysdep-cancel.h> >>> >>> int >>> -__access_noerrno (const char *file, int type) >>> -{ >>> - int res; >>> - INTERNAL_SYSCALL_DECL (err); >>> -#ifdef __NR_access >>> - res = INTERNAL_SYSCALL_CALL (access, err, file, type); >>> -#else >>> - res = INTERNAL_SYSCALL_CALL (faccessat, err, AT_FDCWD, file, type); >>> -#endif >>> - if (INTERNAL_SYSCALL_ERROR_P (res, err)) >>> - return INTERNAL_SYSCALL_ERRNO (res, err); >>> - return 0; >>> -} >>> - >>> -int >>> __access (const char *file, int type) >>> { >>> #ifdef __NR_access >>> diff --git a/sysdeps/unix/sysv/linux/not-errno.h b/sysdeps/unix/sysv/linux/not-errno.h >>> new file mode 100644 >>> index 0000000..4957038 >>> --- /dev/null >>> +++ b/sysdeps/unix/sysv/linux/not-errno.h >>> @@ -0,0 +1,30 @@ >>> +/* Syscall wrapper that do not set errno. Linux version. >>> + Copyright (C) 2017 Free Software Foundation, Inc. >>> + This file is part of the GNU C Library. >>> + >>> + The GNU C Library is free software; you can redistribute it and/or >>> + modify it under the terms of the GNU Lesser General Public >>> + License as published by the Free Software Foundation; either >>> + version 2.1 of the License, or (at your option) any later version. >>> + >>> + The GNU C Library 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 >>> + Lesser General Public License for more details. >>> + >>> + You should have received a copy of the GNU Lesser General Public >>> + License along with the GNU C Library; if not, see >>> + <http://www.gnu.org/licenses/>. */ >>> + >>> +/* This function is used on maybe_enable_malloc_check (elf/dl-tunables.c) >>> + and to avoid having to build/use multiple versions if stack protection >>> + in enabled it is defined as inline. */ >>> +static inline int >>> +__access_noerrno (const char *pathname, int mode) >>> +{ >>> +#ifdef __NR_access >>> + return INTERNAL_SYSCALL_CALL (access, pathname, mode); >>> +#else >>> + return INTERNAL_SYSCALL_CALL (faccessat, AT_FDCWD, file, type); >>> +#endif >>> +} >> >> These are wrong. INTERNAL_SYSCALL_CALL needs a dummy err. >> This seems to work: >> >> diff --git a/sysdeps/unix/sysv/linux/not-errno.h >> b/sysdeps/unix/sysv/linux/not-errno.h >> index 4957038160..a03c399f95 100644 >> --- a/sysdeps/unix/sysv/linux/not-errno.h >> +++ b/sysdeps/unix/sysv/linux/not-errno.h >> @@ -23,8 +23,8 @@ static inline int >> __access_noerrno (const char *pathname, int mode) >> { >> #ifdef __NR_access >> - return INTERNAL_SYSCALL_CALL (access, pathname, mode); >> + return INTERNAL_SYSCALL_CALL (access, err, pathname, mode); >> #else >> - return INTERNAL_SYSCALL_CALL (faccessat, AT_FDCWD, file, type); >> + return INTERNAL_SYSCALL_CALL (faccessat, err, AT_FDCWD, file, type); >> #endif >> } >> > > Right, so we will need the 'INTERNAL_SYSCALL_DECL (err);' before as well. It compiles fine without "INTERNAL_SYSCALL_DECL (err);".
diff --git a/sysdeps/unix/sysv/linux/not-errno.h b/sysdeps/unix/sysv/linux/not-errno.h index 4957038160..a03c399f95 100644 --- a/sysdeps/unix/sysv/linux/not-errno.h +++ b/sysdeps/unix/sysv/linux/not-errno.h @@ -23,8 +23,8 @@ static inline int __access_noerrno (const char *pathname, int mode) { #ifdef __NR_access - return INTERNAL_SYSCALL_CALL (access, pathname, mode); + return INTERNAL_SYSCALL_CALL (access, err, pathname, mode); #else - return INTERNAL_SYSCALL_CALL (faccessat, AT_FDCWD, file, type); + return INTERNAL_SYSCALL_CALL (faccessat, err, AT_FDCWD, file, type); #endif }