From patchwork Wed Oct 14 20:37:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 40721 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B77E23857C55; Wed, 14 Oct 2020 20:37:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B77E23857C55 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1602707836; bh=fi9oXeUNexG1PFKHkqH2nRAoylld8ZaPSO04npzypYE=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Cay4vgSzUIp161VBci+kFBTVR5juaDHDf8FHX13WmE4O2bPPZ4xpVVfrgBfQsVANs FHw2otX0jLkfUXwNISQkInsPwsZK8lS6Rv9AmtEcP6ADMjcTFLn6wXpN173bS5rImI 8+P6XsFe4kYb5W5iS/sirCpJLryYrudIpVozxNWg= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qv1-xf44.google.com (mail-qv1-xf44.google.com [IPv6:2607:f8b0:4864:20::f44]) by sourceware.org (Postfix) with ESMTPS id CC6A53857C43 for ; Wed, 14 Oct 2020 20:37:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org CC6A53857C43 Received: by mail-qv1-xf44.google.com with SMTP id f5so208429qvx.6 for ; Wed, 14 Oct 2020 13:37:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=fi9oXeUNexG1PFKHkqH2nRAoylld8ZaPSO04npzypYE=; b=cAYYnWZ+OF8eh4doKd2Qp77sPsalrKOV/5OqPhLL8I2ZjJyI436fSykIIZhd2D6563 arOfMSrGvvxHvDUJVt96Utqgg2mM5JPaxmf57my+vbDEVgdyEgNyaET3xcIRUGathlkq 8JC/JcYxWp545lBpSOmj9te3poQ1+jIQ7NKvpoltgmDLDN/AtYYV7jxBKQx5SHe/l6Ej OqcbiEQhPmwoawXAc5UDJyhF99oTIbQHVoVm1cm2fPlSdE4xODPIEKfpqHwQa7M7IbZI KZJXuZ0N6+iRRnQInjDxJzqeXdjniB+OjFnh5ccnBhYAyFjCeO0wIj37sKc0X/XUJBy/ PTFg== X-Gm-Message-State: AOAM533BFzwQZJpQHQRE5ZVkYpkFdLofPBkmDHMSVEtFZRzcuQx62Hg7 6pONwDKKGwv03qJEO9STTlOH7R6ovASWFg== X-Google-Smtp-Source: ABdhPJzIRTXBg9cGyyZuxUUozTKmIA0ltwYwRg1/JuDzMHd8gpR+6XUi3tzvu6xA51szXAW3T+mpGw== X-Received: by 2002:a0c:a4c5:: with SMTP id x63mr1161655qvx.58.1602707832860; Wed, 14 Oct 2020 13:37:12 -0700 (PDT) Received: from localhost.localdomain ([177.194.48.209]) by smtp.googlemail.com with ESMTPSA id d142sm341968qke.125.2020.10.14.13.37.11 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Oct 2020 13:37:12 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH 1/3] linux: Use INTERNAL_SYSCALL on fstatat{64} Date: Wed, 14 Oct 2020 17:37:05 -0300 Message-Id: <20201014203707.2394289-1-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Spam-Status: No, score=-14.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" Although not required by the standards, some code expects that a successful stat call should not set errno. However since aa03f722f3b99 'linux: Add {f}stat{at} y2038 support', stat implementation will first try a __NR_statx call and if it fails with ENOSYS then issue the required stat syscall. On 32-bit architecture running on kernel without __NR_statx support the first call will set the errno to ENOSYS, even when the following stat syscall does not fail. This patch fixes by using INTERNAL_SYSCALL and only setting the errno value when function returns. Checked on i686-linux-gnu, x86_64-linux-gnu, sparc64-linux-gnu, sparcv9-linux-gnu, powerpc64-linux-gnu, powerpc64le-linux-gnu, arm-linux-gnueabihf, and aarch64-linux-gnu. --- sysdeps/unix/sysv/linux/fstatat.c | 28 ++++++++++------ sysdeps/unix/sysv/linux/fstatat64.c | 33 ++++++++++--------- .../unix/sysv/linux/mips/mips64/kstat_cp.h | 8 ++--- .../unix/sysv/linux/sparc/sparc64/kstat_cp.h | 4 +-- 4 files changed, 40 insertions(+), 33 deletions(-) diff --git a/sysdeps/unix/sysv/linux/fstatat.c b/sysdeps/unix/sysv/linux/fstatat.c index c7fcfaf277..78fad51961 100644 --- a/sysdeps/unix/sysv/linux/fstatat.c +++ b/sysdeps/unix/sysv/linux/fstatat.c @@ -26,22 +26,24 @@ int __fstatat (int fd, const char *file, struct stat *buf, int flag) { + int r; + # if STAT_IS_KERNEL_STAT /* New kABIs which uses generic pre 64-bit time Linux ABI, e.g. csky, nios2 */ - int r = INLINE_SYSCALL_CALL (fstatat64, fd, file, buf, flag); - if (r == 0 && (buf->__st_ino_pad != 0 - || buf->__st_size_pad != 0 - || buf->__st_blocks_pad != 0)) + r = INTERNAL_SYSCALL_CALL (fstatat64, fd, file, buf, flag); + if (! INTERNAL_SYSCALL_ERROR_P (r) + && (buf->__st_ino_pad != 0 + || buf->__st_size_pad != 0 + || buf->__st_blocks_pad != 0)) return INLINE_SYSCALL_ERROR_RETURN_VALUE (EOVERFLOW); - return r; # else # ifdef __NR_fstatat64 /* Old KABIs with old non-LFS support, e.g. arm, i386, hppa, m68k, mips32, microblaze, s390, sh, powerpc, and sparc. */ struct stat64 st64; - int r = INLINE_SYSCALL_CALL (fstatat64, fd, file, &st64, flag); - if (r == 0) + r = INTERNAL_SYSCALL_CALL (fstatat64, fd, file, &st64, flag); + if (! INTERNAL_SYSCALL_ERROR_P (r)) { if (! in_ino_t_range (st64.st_ino) || ! in_off_t_range (st64.st_size) @@ -67,15 +69,21 @@ __fstatat (int fd, const char *file, struct stat *buf, int flag) buf->st_mtim.tv_nsec = st64.st_mtim.tv_nsec; buf->st_ctim.tv_sec = st64.st_ctim.tv_sec; buf->st_ctim.tv_nsec = st64.st_ctim.tv_nsec; + + return 0; } - return r; # else /* 64-bit kabi outlier, e.g. mips64 and mips64-n32. */ struct kernel_stat kst; - int r = INLINE_SYSCALL_CALL (newfstatat, fd, file, &kst, flag); - return r ?: __cp_kstat_stat (&kst, buf); + r = INTERNAL_SYSCALL_CALL (newfstatat, fd, file, &kst, flag); + if (! INTERNAL_SYSCALL_ERROR_P (r)) + r = __cp_kstat_stat (&kst, buf); # endif /* __nr_fstatat64 */ # endif /* STAT_IS_KERNEL_STAT */ + + return INTERNAL_SYSCALL_ERROR_P (r) + ? INLINE_SYSCALL_ERROR_RETURN_VALUE (-r) + : 0; } weak_alias (__fstatat, fstatat) diff --git a/sysdeps/unix/sysv/linux/fstatat64.c b/sysdeps/unix/sysv/linux/fstatat64.c index ae8fc101c5..f9b603ce5a 100644 --- a/sysdeps/unix/sysv/linux/fstatat64.c +++ b/sysdeps/unix/sysv/linux/fstatat64.c @@ -39,31 +39,32 @@ __fstatat64_time64 (int fd, const char *file, struct __stat64_t64 *buf, /* 32-bit kABI with default 64-bit time_t, e.g. arc, riscv32. Also 64-bit time_t support is done through statx syscall. */ struct statx tmp; - r = INLINE_SYSCALL_CALL (statx, fd, file, AT_NO_AUTOMOUNT | flag, - STATX_BASIC_STATS, &tmp); - if (r == 0 || errno != ENOSYS) + r = INTERNAL_SYSCALL_CALL (statx, fd, file, AT_NO_AUTOMOUNT | flag, + STATX_BASIC_STATS, &tmp); + if (! INTERNAL_SYSCALL_ERROR_P (r)) { - if (r == 0) - __cp_stat64_t64_statx (buf, &tmp); + __cp_stat64_t64_statx (buf, &tmp); return r; } + if (-r != ENOSYS) + return INLINE_SYSCALL_ERROR_RETURN_VALUE (-r); #endif #if XSTAT_IS_XSTAT64 # ifdef __NR_newfstatat /* 64-bit kABI, e.g. aarch64, ia64, powerpc64*, s390x, riscv64, and x86_64. */ - r = INLINE_SYSCALL_CALL (newfstatat, fd, file, buf, flag); + r = INTERNAL_SYSCALL_CALL (newfstatat, fd, file, buf, flag); # elif defined __NR_fstatat64 # if STAT64_IS_KERNEL_STAT64 /* 64-bit kABI outlier, e.g. alpha */ - r = INLINE_SYSCALL_CALL (fstatat64, fd, file, buf, flag); + r = INTERNAL_SYSCALL_CALL (fstatat64, fd, file, buf, flag); # else /* 64-bit kABI outlier, e.g. sparc64. */ struct kernel_stat64 kst64; - r = INLINE_SYSCALL_CALL (fstatat64, fd, file, &kst64, flag); - if (r == 0) - r = __cp_stat64_kstat64 (buf, &kst64); + r = INTERNAL_SYSCALL_CALL (fstatat64, fd, file, &kst64, flag); + if (! INTERNAL_SYSCALL_ERROR_P (r)) + __cp_stat64_kstat64 (buf, &kst64); # endif # endif #else @@ -72,8 +73,8 @@ __fstatat64_time64 (int fd, const char *file, struct __stat64_t64 *buf, e.g. arm, csky, i386, hppa, m68k, microblaze, nios2, sh, powerpc32, and sparc32. */ struct stat64 st64; - r = INLINE_SYSCALL_CALL (fstatat64, fd, file, &st64, flag); - if (r == 0) + r = INTERNAL_SYSCALL_CALL (fstatat64, fd, file, &st64, flag); + if (! INTERNAL_SYSCALL_ERROR_P (r)) { /* Clear both pad and reserved fields. */ memset (buf, 0, sizeof (*buf)); @@ -95,13 +96,15 @@ __fstatat64_time64 (int fd, const char *file, struct __stat64_t64 *buf, # else /* 64-bit kabi outlier, e.g. mips64 and mips64-n32. */ struct kernel_stat kst; - r = INLINE_SYSCALL_CALL (newfstatat, fd, file, &kst, flag); + r = INTERNAL_SYSCALL_CALL (newfstatat, fd, file, &kst, flag); if (r == 0) - r = __cp_kstat_stat64_t64 (&kst, buf); + __cp_kstat_stat64_t64 (&kst, buf); # endif #endif - return r; + return INTERNAL_SYSCALL_ERROR_P (r) + ? INLINE_SYSCALL_ERROR_RETURN_VALUE (-r) + : 0; } #if __TIMESIZE != 64 hidden_def (__fstatat64_time64) diff --git a/sysdeps/unix/sysv/linux/mips/mips64/kstat_cp.h b/sysdeps/unix/sysv/linux/mips/mips64/kstat_cp.h index 1805d4b85f..71fe39fdd0 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/kstat_cp.h +++ b/sysdeps/unix/sysv/linux/mips/mips64/kstat_cp.h @@ -19,13 +19,13 @@ #include #include -static inline int +static inline long int __cp_kstat_stat (const struct kernel_stat *kst, struct stat *st) { if (! in_ino_t_range (kst->st_ino) || ! in_off_t_range (kst->st_size) || ! in_blkcnt_t_range (kst->st_blocks)) - return INLINE_SYSCALL_ERROR_RETURN_VALUE (EOVERFLOW); + return -EOVERFLOW; st->st_dev = kst->st_dev; memset (&st->st_pad1, 0, sizeof (st->st_pad1)); @@ -51,7 +51,7 @@ __cp_kstat_stat (const struct kernel_stat *kst, struct stat *st) return 0; } -static inline int +static inline void __cp_kstat_stat64_t64 (const struct kernel_stat *kst, struct __stat64_t64 *st) { st->st_dev = kst->st_dev; @@ -70,6 +70,4 @@ __cp_kstat_stat64_t64 (const struct kernel_stat *kst, struct __stat64_t64 *st) st->st_mtim.tv_nsec = kst->st_mtime_nsec; st->st_ctim.tv_sec = kst->st_ctime_sec; st->st_ctim.tv_nsec = kst->st_ctime_nsec; - - return 0; } diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/kstat_cp.h b/sysdeps/unix/sysv/linux/sparc/sparc64/kstat_cp.h index 0599b6a49e..d3f2841ade 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/kstat_cp.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/kstat_cp.h @@ -18,7 +18,7 @@ #include -static inline int +static inline void __cp_stat64_kstat64 (struct stat64 *st64, const struct kernel_stat64 *kst64) { st64->st_dev = kst64->st_dev; @@ -41,6 +41,4 @@ __cp_stat64_kstat64 (struct stat64 *st64, const struct kernel_stat64 *kst64) st64->st_ctim.tv_nsec = kst64->st_ctime_nsec; st64->__glibc_reserved4 = 0; st64->__glibc_reserved5 = 0; - - return 0; } From patchwork Wed Oct 14 20:37:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 40722 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BD9383870913; Wed, 14 Oct 2020 20:37:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BD9383870913 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1602707837; bh=XXjeNnf6HxYna0sDIFO2lfnOJWDCFWoPiLBXxiFOazA=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=x2BKS1/uD30pOrYGAcI5sWrotbIDwM6uGLvTpNoi47Aeyra4EN955iaGvzsQes4FT lFiVHeii5Pi559Zv/VeWzCJ2+4YS4pPfdTtrO/T0zHBixTmBgqdZxAJ9WWYXHYd0nu aaMBswrBajIVFCTLTWW4BjWNru9P+aMa11bXr/OE= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qv1-xf44.google.com (mail-qv1-xf44.google.com [IPv6:2607:f8b0:4864:20::f44]) by sourceware.org (Postfix) with ESMTPS id 01DDE3857C55 for ; Wed, 14 Oct 2020 20:37:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 01DDE3857C55 Received: by mail-qv1-xf44.google.com with SMTP id 13so200391qvc.9 for ; Wed, 14 Oct 2020 13:37:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=XXjeNnf6HxYna0sDIFO2lfnOJWDCFWoPiLBXxiFOazA=; b=VGWsW+7CTh9GPfRgPYCCLKap8xBnJJ+UtlpVI4eWGJ/C5TF5nEChgMsUHGrQ2YmbEr 1If8DCf5pVGwEiFV+zJ+RC1f8ZU1jaNkHwtfM4h8jRsRCeG98LXF+Ex7pIjzBRLB9Wah 03tr03ppokY56O8QpGgmkClZUe/LyhOuAnqjUihL7K0V4DvbjfKheiUwW4dth5yNXD3C QwMKb+FvkAttOjhUwJCOfsDWZZpKvKsWKfS7qVmH8NUuD+JLt2vo6/SORv7Lbo9TOuSU U6ECEAN+gVk7fhIrJOUkXOsCzI5A+OYY2EU3fV0CXQytk0ggySjn80z7FyFS/UjrwToO xI3Q== X-Gm-Message-State: AOAM532NGHHRTwM+mpsna49Z3gr55t86UFRnFSKRJGxOvsguaS9uDQOM JeUwLOsJo/FqrzlT8NmEgYs77tgmUnqWaQ== X-Google-Smtp-Source: ABdhPJw0CHrFFjHGsLcmnMK+CU162/UPIRvyqDiuPe4MSeZm0Zo10BHVVUHroOiJpXDg35vwDlAMMw== X-Received: by 2002:ad4:456c:: with SMTP id o12mr1190407qvu.48.1602707834326; Wed, 14 Oct 2020 13:37:14 -0700 (PDT) Received: from localhost.localdomain ([177.194.48.209]) by smtp.googlemail.com with ESMTPSA id d142sm341968qke.125.2020.10.14.13.37.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Oct 2020 13:37:13 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH 2/3] rtld: Fix wrong errno check on open_path Date: Wed, 14 Oct 2020 17:37:06 -0300 Message-Id: <20201014203707.2394289-2-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201014203707.2394289-1-adhemerval.zanella@linaro.org> References: <20201014203707.2394289-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-14.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" At open_path code: elf/dl-load.c 1982 if (here_any && (err = errno) != ENOENT && err != EACCES) 1983 /* The file exists and is readable, but something went wrong. */ 1984 return -1; This code checks the errno value without checking whether the previous function call that changed 'err' actually has failed (in this specific case the stat64 at line 1931). This due how we currently implemented the y2038 support with INLINE_SYSCALL_CALL (since a function that succeeds is allowed to change errno and it simplifies the resulting y2038 support a bit). In fact this check does not really make much sense, since either 'fd' will be different than '0' (meaning it has being opened) or the 'stat64' at line 1931 failed and 'here_any' will not be set (the stat64 at line 1951 already explicit sets errno in failure case). Also, git history does not give much information on why it was added at fist place. Checked on i686-linux-gnu, x86_64-linux-gnu, sparc64-linux-gnu, sparcv9-linux-gnu, powerpc64-linux-gnu, powerpc64le-linux-gnu, arm-linux-gnueabihf, and aarch64-linux-gnu. --- elf/dl-load.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/elf/dl-load.c b/elf/dl-load.c index f3201e7c14..e6972a6fe6 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1878,7 +1878,6 @@ open_path (const char *name, size_t namelen, int mode, size_t cnt; char *edp; int here_any = 0; - int err; /* If we are debugging the search for libraries print the path now if it hasn't happened now. */ @@ -1979,9 +1978,6 @@ open_path (const char *name, size_t namelen, int mode, return -1; } } - if (here_any && (err = errno) != ENOENT && err != EACCES) - /* The file exists and is readable, but something went wrong. */ - return -1; /* Remember whether we found anything. */ any |= here_any; @@ -2002,6 +1998,8 @@ open_path (const char *name, size_t namelen, int mode, sps->dirs = (void *) -1; } + /* The errno is used by _dl_signal_error. */ + __set_errno (ENOENT); return -1; } From patchwork Wed Oct 14 20:37:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 40723 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 49395394343A; Wed, 14 Oct 2020 20:37:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 49395394343A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1602707838; bh=mJwqbwBeenyYHgpO0OmWoY7hgytKibVioCrp2CHNXIM=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=aiymjPPoZJ0y0cECfyKJRIXMStmd+2DIcnBu+8S7dcvjvEnHBfGcehfmLsUIriRaa NNTGYBGecrtvEpTR7V7D4HNyNguuuU+hJrgHVGvBC3n5gGcF7JLk1D217epMzID/Id BUtY+JyNOrHodrJ2TREkUgi+PJfvoF2bEFelJouQ= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qk1-x742.google.com (mail-qk1-x742.google.com [IPv6:2607:f8b0:4864:20::742]) by sourceware.org (Postfix) with ESMTPS id B8B9A385780E for ; Wed, 14 Oct 2020 20:37:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org B8B9A385780E Received: by mail-qk1-x742.google.com with SMTP id a23so593968qkg.13 for ; Wed, 14 Oct 2020 13:37:16 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mJwqbwBeenyYHgpO0OmWoY7hgytKibVioCrp2CHNXIM=; b=thBPPpO3Uz+hs8aiq3W37xRTZpshKQCiCh9K/+47cxhhM0D9RmELkWl40/zItKm+9v U40bLFqjnxa9DCsD4VtTvYxptURC2PNS5OFzNti6H8ALdnLG4RhPrTq7W+YyO4M7z3d/ pB7wFYZP83bdan00sQkMHKf5OxooohGOHJ8udJnesfSvhBuLfrwBCnu4EkjFKO+Gbzia maOQDWdJcrO1xzmVbKGsmVsy7oZXyrkrrS6Z7Ii+bGKFiyV0rJiHEOH8ttycpMISGmYu gU6iBH9gju0m0LbOZXff6K1znpVpg6I/ZcBDhR6vsbPS2NeMB3LFmf05whNZqvP2zILL 9mlA== X-Gm-Message-State: AOAM532tVvsn89rN+vuFy1LQVVHraeeYkyzBrXFDgudj7BnF8WoUb3jS 5gx0d0ni0k+G8Ki+QCrhb+DPBuP18ciBfQ== X-Google-Smtp-Source: ABdhPJxZ9ufFPPYGVLFbh3s1nLWxc0ZyBFticcA2E0lyM/orYlsWVS46QTurHI5kXpYtFEjzuDQufg== X-Received: by 2002:a37:ef04:: with SMTP id j4mr911920qkk.260.1602707835886; Wed, 14 Oct 2020 13:37:15 -0700 (PDT) Received: from localhost.localdomain ([177.194.48.209]) by smtp.googlemail.com with ESMTPSA id d142sm341968qke.125.2020.10.14.13.37.14 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Oct 2020 13:37:15 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH 3/3] locale: Fix locale construct_output_path error handling Date: Wed, 14 Oct 2020 17:37:07 -0300 Message-Id: <20201014203707.2394289-3-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201014203707.2394289-1-adhemerval.zanella@linaro.org> References: <20201014203707.2394289-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-14.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" On following localedef code: 237 output_path = construct_output_path (argv[remaining]); 238 if (output_path == NULL && ! no_archive) 239 error (4, errno, _("cannot create directory for output files")); 240 cannot_write_why = errno; The 'cannot_write_why' will be set to a non 0 value on success if euidaccess or mkdir (called by construct_output_path) change the errno on a success call. Instead o relying on the errno value regardless the previous libc call fails or not, explicit set the erro code on failure at construct_output_path. Checked on x86_64-linux-gnu. --- locale/programs/localedef.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c index b048bd05b9..4b488d5c2e 100644 --- a/locale/programs/localedef.c +++ b/locale/programs/localedef.c @@ -180,7 +180,7 @@ static struct argp argp = /* Prototypes for local functions. */ static void error_print (void); -static char *construct_output_path (char *path); +static char *construct_output_path (char *path, int *cannot_write_why); static char *normalize_codeset (const char *codeset, size_t name_len); @@ -234,10 +234,9 @@ main (int argc, char *argv[]) /* The parameter describes the output path of the constructed files. If the described files cannot be written return a NULL pointer. We don't free output_path because we will exit. */ - output_path = construct_output_path (argv[remaining]); + output_path = construct_output_path (argv[remaining], &cannot_write_why); if (output_path == NULL && ! no_archive) error (4, errno, _("cannot create directory for output files")); - cannot_write_why = errno; /* Now that the parameters are processed we have to reset the local ctype locale. (P1003.2 4.35.5.2) */ @@ -478,7 +477,7 @@ error_print (void) '/' character it is a relative path. Otherwise it names the locale this definition is for. The returned path must be freed by the caller. */ static char * -construct_output_path (char *path) +construct_output_path (char *path, int *cannot_write_why) { char *result; @@ -533,6 +532,7 @@ construct_output_path (char *path) } errno = 0; + *cannot_write_why = 0; if (no_archive && euidaccess (result, W_OK) == -1) { @@ -545,14 +545,18 @@ construct_output_path (char *path) record_verbose (stderr, _("cannot create output path \'%s\': %s"), result, strerror (errno)); + *cannot_write_why = errno; free (result); - return NULL; + result = NULL; } } else - record_verbose (stderr, - _("no write permission to output path \'%s\': %s"), - result, strerror (errno)); + { + record_verbose (stderr, + _("no write permission to output path \'%s\': %s"), + result, strerror (errno)); + *cannot_write_why = errno; + } } return result;