From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x530.google.com (mail-pg1-x530.google.com [IPv6:2607:f8b0:4864:20::530]) by sourceware.org (Postfix) with ESMTPS id C923F3857424 for ; Wed, 22 Jun 2022 15:24:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C923F3857424 Received: by mail-pg1-x530.google.com with SMTP id r66so10445105pgr.2 for ; Wed, 22 Jun 2022 08:24:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=PL+x9ARe9/fJ61adpqvQ0FrVfLG/P7K4UC4UdAPi06o=; b=zkHNMPgjCv0I0fLIplg6z592Yns+sWr7QcXFAjw0WFrqw/8U6IqxYF7Nhj9Ro916Gi C5QZ4GTw8i9V8LX6frWQiOpBqstjEQxTOUDPBEDEFIb5pku57ufkq2WZvEdt/QCzYpEh Mn2e2B4mk9CP5XUBanNBwq3QouQrsCQLFABzAzZQqGhHOK+uqcMlqxUbQak8wb+SDyKR Qwgv8/2E4WfKEHiWglf4s4LgJEmf5GqGXTqGJInwU7eAkTWit0vrdCC8zSUFy8KcSP1b 0iowIeOLqaUMaOX92fZk68NxrnwLS7tTjri0clgWmCh3GLD9cbAzNWCzEA3WKDzvT2S+ aWXA== X-Gm-Message-State: AJIora/Kb1SEhzaO9AEYudf1H3W+sKIV4jPyw0FpZlZNWRZfSM8RfyMQ 2ZvyhgQJsR06fFlZDm4g5+y52k9ZS3s= X-Google-Smtp-Source: AGRyM1sthSb2ei+ctbzf/iSi62GocZUFWjotqF/diZL3GupFTtz5bDabJt5zD6hnn8Lt+NYuJ89USA== X-Received: by 2002:a63:8441:0:b0:40d:34a3:b7ce with SMTP id k62-20020a638441000000b0040d34a3b7cemr2195521pgd.292.1655911474625; Wed, 22 Jun 2022 08:24:34 -0700 (PDT) Received: from noah-tgl.. ([2600:1010:b051:c9b1:ebd:7344:481e:99be]) by smtp.gmail.com with ESMTPSA id c18-20020a170902b69200b00166423df3cdsm12946187pls.209.2022.06.22.08.24.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jun 2022 08:24:34 -0700 (PDT) From: Noah Goldstein To: libc-alpha@sourceware.org Subject: [PATCH v2] stdlib: Remove attr_write from mbstows if dst is NULL [BZ: 29265] Date: Wed, 22 Jun 2022 08:24:21 -0700 Message-Id: <20220622152421.989555-1-goldstein.w.n@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220621161821.2940071-1-goldstein.w.n@gmail.com> References: <20220621161821.2940071-1-goldstein.w.n@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, 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-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-List-Received-Date: Wed, 22 Jun 2022 15:24:37 -0000 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. --- 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 60fc59c12c..6ef725ef74 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -373,6 +373,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 277d099e22..d9c2d822a5 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.34.1