From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 68159 invoked by alias); 30 Jan 2018 19:31:36 -0000 Mailing-List: contact libc-stable-help@sourceware.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: List-Archive: Sender: libc-stable-owner@sourceware.org Received: (qmail 68148 invoked by uid 89); 30 Jan 2018 19:31:35 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.99.2 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,KAM_SHORT,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 spammy= X-Spam-Status: No, score=-24.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,KAM_SHORT,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: mo19.mail-out.ovh.net Received: from mo19.mail-out.ovh.net (HELO mo19.mail-out.ovh.net) (178.32.228.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 30 Jan 2018 19:31:33 +0000 Received: from EX2.emp.local (gw1.pro1.mail.ovh.net [79.137.0.65]) by mo19.mail-out.ovh.net (Postfix) with ESMTPS id 8FEF128CBC for ; Tue, 30 Jan 2018 20:31:31 +0100 (CET) Received: from localhost (32.104.18.202) by EX2.emp.local (172.16.2.2) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1261.35; Tue, 30 Jan 2018 20:31:30 +0100 From: "Gabriel F. T. Gomes" To: Subject: [2.25 1/2] tunables: Use direct syscall for access (BZ#21744) Date: Mon, 01 Jan 2018 00:00:00 -0000 Message-ID: <20180130193123.527-2-gabriel@inconstante.eti.br> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180130193123.527-1-gabriel@inconstante.eti.br> References: <20180130193123.527-1-gabriel@inconstante.eti.br> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [32.104.18.202] X-ClientProxiedBy: EX3.emp.local (172.16.2.3) To EX2.emp.local (172.16.2.2) X-Ovh-Tracer-Id: 14416866833855270584 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: 0 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedtfedrtddtgddutdelucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecufedttdenuc X-IsSubscribed: yes X-SW-Source: 2018-01/txt/msg00060.txt.bz2 From: Adhemerval Zanella 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 [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. (cherry picked from commit 95a73392580761abc62fc9b1386d232cd55878e9) --- ChangeLog | 10 ++++++++++ NEWS | 1 + 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 | 35 +++++++++++++++++++++++++++++++++++ 7 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 sysdeps/generic/not-errno.h create mode 100644 sysdeps/unix/sysv/linux/not-errno.h diff --git a/ChangeLog b/ChangeLog index a875c01445..ea0a24adf9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2017-07-24 Adhemerval Zanella + H.J. Lu + + [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. + 2018-01-19 H.J. Lu [BZ #22715] diff --git a/NEWS b/NEWS index 2f3f492edd..4c4eb834a1 100644 --- a/NEWS +++ b/NEWS @@ -60,6 +60,7 @@ The following bugs are resolved with this release: [21386] Assertion in fork for distinct parent PID is incorrect [21624] Unsafe alloca allows local attackers to alias stack and heap (CVE-2017-1000366) [21654] nss: Fix invalid cast in group merging + [21744] tunables: Use direct syscall for access [21778] Robust mutex may deadlock [21915] getaddrinfo: incorrect result handling for NSS service modules [21922] getaddrinfo with AF_INET(6) returns EAI_NONAME, not EAI_NODATA diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c index e42aa67003..7ee3f98c8d 100644 --- a/elf/dl-tunables.c +++ b/elf/dl-tunables.c @@ -30,6 +30,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 16d68a1505..d2802b2b3e 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -181,13 +181,6 @@ 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 - __END_DECLS # endif diff --git a/sysdeps/generic/not-errno.h b/sysdeps/generic/not-errno.h new file mode 100644 index 0000000000..2aac095e71 --- /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 67e69bd163..366b6b6461 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 0000000000..65f93f331d --- /dev/null +++ b/sysdeps/unix/sysv/linux/not-errno.h @@ -0,0 +1,35 @@ +/* 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) +{ + int res; + INTERNAL_SYSCALL_DECL (err); +#ifdef __NR_access + res = INTERNAL_SYSCALL_CALL (access, err, pathname, mode); +#else + res = INTERNAL_SYSCALL_CALL (faccessat, err, AT_FDCWD, pathname, mode); +#endif + if (INTERNAL_SYSCALL_ERROR_P (res, err)) + return INTERNAL_SYSCALL_ERRNO (res, err); + return 0; +} -- 2.13.6