From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from hall.aurel32.net (hall.aurel32.net [IPv6:2001:bc8:30d7:100::1]) by sourceware.org (Postfix) with ESMTPS id 6378E3858C2F; Mon, 15 Aug 2022 22:17:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6378E3858C2F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=aurel32.net Authentication-Results: sourceware.org; spf=none smtp.mailfrom=aurel32.net DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=aurel32.net ; s=202004.hall; h=Content-Transfer-Encoding:MIME-Version:Message-Id:Date: Subject:Cc:To:From:Content-Type:From:Reply-To:Subject:Content-ID: Content-Description:In-Reply-To:References:X-Debbugs-Cc; bh=oIH8f+aoju3kAKXcMTPC2lxeQGYKMuWeyfs1C722TBE=; b=cFRNfhuWUa6b7yMkMyBUNGZcfW oOhf7BjYWL+43YNqSlpMIm373nCYsq/pV7jX4jHnnNwM5dfYI3EywbRTURDibtPjaADliWPhCFbgC 342JPg/K/XGe+CGcEh1wBxLEiVc+RKd7S9e0K4ac5Db02v2iPOyxW70ujn++njf2fGClcgkSErZc7 4amFjVElutblvKO1z6XOF7QzcOsxkgHkpoKkwLKQhGHC8hiY+uFiZUM3GAC0X95IGw8DEyHF3Xl9O YkfsoDR6Y9Ig19ZjMtkEDaOQTMNrYNITLKUGL74PqY9fzxserqU6wCwoAiE5OjkJGrHSCrEIYtYhg cDqO+G/g==; Received: from [2a01:e0a:406:7381:12d4:684f:f4be:978c] (helo=ohm.aurel32.net) by hall.aurel32.net with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1oNiOw-008oWM-Dd; Tue, 16 Aug 2022 00:17:38 +0200 Received: from aurel32 by ohm.aurel32.net with local (Exim 4.96) (envelope-from ) id 1oNiOp-00AQvt-1H; Tue, 16 Aug 2022 00:17:31 +0200 From: Aurelien Jarno To: libc-stable@sourceware.org Cc: Noah Goldstein , Siddhesh Poyarekar Subject: [COMMITTED 2.34 1/2] stdlib: Remove attr_write from mbstows if dst is NULL [BZ: 29265] Date: Tue, 16 Aug 2022 00:17:07 +0200 Message-Id: <20220815221707.2475899-1-aurelien@aurel32.net> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-13.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-stable@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-stable mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Aug 2022 22:17:43 -0000 From: Noah Goldstein mbstows is defined if dst is NULL and is defined to special cased if dst is NULL so the fortify objsize check if incorrect in that case. Tested on x86-64 linux. Reviewed-by: Siddhesh Poyarekar (cherry picked from commit 464d189b9622932a75302290625de84931656ec0) --- stdlib/Makefile | 3 +++ stdlib/bits/stdlib.h | 16 +++++++++++----- stdlib/testmb.c | 7 +++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/stdlib/Makefile b/stdlib/Makefile index a4ac30d1f6..e13f1ee33c 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -217,6 +217,9 @@ CFLAGS-tst-qsort.c += $(stack-align-test-flags) CFLAGS-tst-makecontext.c += -funwind-tables CFLAGS-tst-makecontext2.c += $(stack-align-test-flags) +CFLAGS-testmb.c += -D_FORTIFY_SOURCE=2 -Wall -Werror + + # Run a test on the header files we use. tests-special += $(objpfx)isomac.out diff --git a/stdlib/bits/stdlib.h b/stdlib/bits/stdlib.h index ccacbdf76a..f0918d5d79 100644 --- a/stdlib/bits/stdlib.h +++ b/stdlib/bits/stdlib.h @@ -96,6 +96,11 @@ extern size_t __mbstowcs_chk (wchar_t *__restrict __dst, const char *__restrict __src, size_t __len, size_t __dstlen) __THROW __attr_access ((__write_only__, 1, 3)) __attr_access ((__read_only__, 2)); +extern size_t __REDIRECT_NTH (__mbstowcs_chk_nulldst, + (wchar_t *__restrict __dst, + const char *__restrict __src, + size_t __len), mbstowcs_chk) + __attr_access ((__read_only__, 2)); extern size_t __REDIRECT_NTH (__mbstowcs_alias, (wchar_t *__restrict __dst, const char *__restrict __src, @@ -108,16 +113,17 @@ extern size_t __REDIRECT_NTH (__mbstowcs_chk_warn, __warnattr ("mbstowcs called with dst buffer smaller than len " "* sizeof (wchar_t)"); -__fortify_function size_t +__always_inline __fortify_function size_t __NTH (mbstowcs (wchar_t *__restrict __dst, const char *__restrict __src, size_t __len)) { - return __glibc_fortify_n (mbstowcs, __len, sizeof (wchar_t), - __glibc_objsize (__dst), - __dst, __src, __len); + if (__builtin_constant_p (__dst == NULL) && __dst == NULL) + return __mbstowcs_chk_nulldst (__dst, __src, __len); + else + return __glibc_fortify_n (mbstowcs, __len, sizeof (wchar_t), + __glibc_objsize (__dst), __dst, __src, __len); } - extern size_t __wcstombs_chk (char *__restrict __dst, const wchar_t *__restrict __src, size_t __len, size_t __dstlen) __THROW diff --git a/stdlib/testmb.c b/stdlib/testmb.c index 45dae7db61..6ac4dfd21d 100644 --- a/stdlib/testmb.c +++ b/stdlib/testmb.c @@ -16,6 +16,13 @@ main (int argc, char *argv[]) lose = 1; } + i = mbstowcs (NULL, "bar", 4); + if (!(i == 3 && w[1] == 'a')) + { + puts ("mbstowcs FAILED2!"); + lose = 1; + } + mbstowcs (w, "blah", 5); i = wcstombs (c, w, 10); if (i != 4) -- 2.35.1