From patchwork Wed Jul 19 21:53:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 21697 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: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , 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> <874luag5n4.fsf@mid.deneb.enyo.de> <6dc48782-60c3-cead-08c0-7e018e7eb9ef@linaro.org> <80b843b8-6e3c-ccbe-5a6f-b37e18dbdbae@linaro.org> From: "H.J. Lu" Date: Wed, 19 Jul 2017 14:53:33 -0700 Message-ID: Subject: Re: [PATCH] Don't all __access_noerrno with stack protector from __tunables_init [BZ #21744] To: Adhemerval Zanella Cc: Florian Weimer , GNU C Library On Tue, Jul 18, 2017 at 6:52 AM, Adhemerval Zanella 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 > Adhemerval Zanella 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 > + > #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 > # 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 > + . */ > + > +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 > > 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 > + . */ > + > +/* 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 }