From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qk1-x732.google.com (mail-qk1-x732.google.com [IPv6:2607:f8b0:4864:20::732]) by sourceware.org (Postfix) with ESMTPS id 73C863858C53 for ; Wed, 21 Sep 2022 22:02:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 73C863858C53 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-qk1-x732.google.com with SMTP id x18so4993432qkn.6 for ; Wed, 21 Sep 2022 15:02:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date; bh=1jWh4WdvVJApzWVZ0WRYUy4eiaM0eWGiBeAFlncs5WA=; b=GUuQiCr0XfXEH83cadGk4XssmJotS7dgWTGNTll/IkGD6nZWNNU/GSACHzrYYSW0yN MWJNeh3cZcKkgx8eadz6D5bRn8spNPwyLxrkJEEStDsAbqqu5oq6M181CkaMB3P8fZHz DnnKKvYH0EqX5d+aeXaRZpumSVb2mRCY5MXjIAin7R2zP/piWb+O8gLmOt3h1nP3XRxm xWNxw5ISZf5hCB/SwDWetKxQgPZ49rTIl0HZ7HuZP8SGuxx9fWkWTYCgr8fH/6AT/xkh NXoKcop+TMNzjQbrgNt56XwrkI2koWvgZdav9qWVBLz63a5gfiICQApmIsbYfX3VQ6zg RyIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date; bh=1jWh4WdvVJApzWVZ0WRYUy4eiaM0eWGiBeAFlncs5WA=; b=XHA49EEV7ikP8/XH2X7bqVCQS6LKlJEzgUJELwF52N4Y2AS2EF1yK7H9ROBIGAruJ6 b89FVoifeER9AERrYTyqYBae/4nrXYumSsLIF91dsaaL649lAByLvDRHjckuw1l7i84P DzEtT87PACI66hfkGfEWxDQ/LeS1ZoX4BH0oM6vCvD16pJyu7x/hB+tcq+4Z48rbGRh5 2YgFvRdqCHrgoH3I30w9rVaQpp8dtDV15lVF2fGhTk1nPRuGBoOkODBKLvvvvkFEsC8Q PpNURQohRb6fzbmXQovDboa2JH3zgRc5+0XcTrKeFcFgXFPWtJ2kTZK8cgkIWmaa38qc 7INQ== X-Gm-Message-State: ACrzQf2DAjusH4TCL9JBqDMnVV/+dsIE8GbA4Fy+oiG6TD/JF1kjQ+6v 4QMGSe5LOFshUyt36y8FEwXZEyn0Lc+oiTqZjyg= X-Google-Smtp-Source: AMsMyM6n0wysmElfd0GmUmDyFn9S8d1bOhYhQ/g0gDI3N27gwbi5wi1glkLHJuUQi+zXhEdBf2ckolSKwBkDlCpxoP0= X-Received: by 2002:a37:e307:0:b0:6ce:368f:6a0f with SMTP id y7-20020a37e307000000b006ce368f6a0fmr140354qki.81.1663797721819; Wed, 21 Sep 2022 15:02:01 -0700 (PDT) MIME-Version: 1.0 References: <20220921005804.7131-1-goldstein.w.n@gmail.com> In-Reply-To: <20220921005804.7131-1-goldstein.w.n@gmail.com> From: "H.J. Lu" Date: Wed, 21 Sep 2022 15:01:25 -0700 Message-ID: Subject: Re: [PATCH v1] x86: Fix wcsnlen-avx2 page cross length comparison [BZ #29591] To: Noah Goldstein Cc: libc-alpha@sourceware.org, carlos@systemhalted.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-3024.3 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 autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Tue, Sep 20, 2022 at 5:58 PM Noah Goldstein wrote: > > Previous implementation was adjusting length (rsi) to match > bytes (eax), but since there is no bound to length this can cause > overflow. > > Fix is to just convert the byte-count (eax) to length by dividing by > sizeof (wchar_t) before the comparison. > > Full check passes on x86-64 and build succeeds w/ and w/o multiarch. > --- > string/test-strnlen.c | 70 +++++++++++++++----------- > sysdeps/x86_64/multiarch/strlen-avx2.S | 7 +-- > 2 files changed, 43 insertions(+), 34 deletions(-) > > diff --git a/string/test-strnlen.c b/string/test-strnlen.c > index 4a9375112a..5cbaf4b734 100644 > --- a/string/test-strnlen.c > +++ b/string/test-strnlen.c > @@ -73,7 +73,7 @@ do_test (size_t align, size_t len, size_t maxlen, int max_char) > { > size_t i; > > - align &= 63; > + align &= (getpagesize () / sizeof (CHAR) - 1); > if ((align + len) * sizeof (CHAR) >= page_size) > return; > > @@ -90,38 +90,50 @@ do_test (size_t align, size_t len, size_t maxlen, int max_char) > static void > do_overflow_tests (void) > { > - size_t i, j, len; > + size_t i, j, al_idx, repeats, len; > const size_t one = 1; > uintptr_t buf_addr = (uintptr_t) buf1; > + const size_t alignments[] = { 0, 1, 7, 9, 31, 33, 63, 65, 95, 97, 127, 129 }; > > - for (i = 0; i < 750; ++i) > + for (al_idx = 0; al_idx < sizeof (alignments) / sizeof (alignments[0]); > + al_idx++) > { > - do_test (1, i, SIZE_MAX, BIG_CHAR); > - > - do_test (0, i, SIZE_MAX - i, BIG_CHAR); > - do_test (0, i, i - buf_addr, BIG_CHAR); > - do_test (0, i, -buf_addr - i, BIG_CHAR); > - do_test (0, i, SIZE_MAX - buf_addr - i, BIG_CHAR); > - do_test (0, i, SIZE_MAX - buf_addr + i, BIG_CHAR); > - > - len = 0; > - for (j = 8 * sizeof(size_t) - 1; j ; --j) > - { > - len |= one << j; > - do_test (0, i, len - i, BIG_CHAR); > - do_test (0, i, len + i, BIG_CHAR); > - do_test (0, i, len - buf_addr - i, BIG_CHAR); > - do_test (0, i, len - buf_addr + i, BIG_CHAR); > - > - do_test (0, i, ~len - i, BIG_CHAR); > - do_test (0, i, ~len + i, BIG_CHAR); > - do_test (0, i, ~len - buf_addr - i, BIG_CHAR); > - do_test (0, i, ~len - buf_addr + i, BIG_CHAR); > - > - do_test (0, i, -buf_addr, BIG_CHAR); > - do_test (0, i, j - buf_addr, BIG_CHAR); > - do_test (0, i, -buf_addr - j, BIG_CHAR); > - } > + for (repeats = 0; repeats < 2; ++repeats) > + { > + size_t align = repeats ? (getpagesize () - alignments[al_idx]) > + : alignments[al_idx]; > + align /= sizeof (CHAR); > + for (i = 0; i < 750; ++i) > + { > + do_test (align, i, SIZE_MAX, BIG_CHAR); > + > + do_test (align, i, SIZE_MAX - i, BIG_CHAR); > + do_test (align, i, i - buf_addr, BIG_CHAR); > + do_test (align, i, -buf_addr - i, BIG_CHAR); > + do_test (align, i, SIZE_MAX - buf_addr - i, BIG_CHAR); > + do_test (align, i, SIZE_MAX - buf_addr + i, BIG_CHAR); > + > + len = 0; > + for (j = 8 * sizeof (size_t) - 1; j; --j) > + { > + len |= one << j; > + do_test (align, i, len, BIG_CHAR); > + do_test (align, i, len - i, BIG_CHAR); > + do_test (align, i, len + i, BIG_CHAR); > + do_test (align, i, len - buf_addr - i, BIG_CHAR); > + do_test (align, i, len - buf_addr + i, BIG_CHAR); > + > + do_test (align, i, ~len - i, BIG_CHAR); > + do_test (align, i, ~len + i, BIG_CHAR); > + do_test (align, i, ~len - buf_addr - i, BIG_CHAR); > + do_test (align, i, ~len - buf_addr + i, BIG_CHAR); > + > + do_test (align, i, -buf_addr, BIG_CHAR); > + do_test (align, i, j - buf_addr, BIG_CHAR); > + do_test (align, i, -buf_addr - j, BIG_CHAR); > + } > + } > + } > } > } > > diff --git a/sysdeps/x86_64/multiarch/strlen-avx2.S b/sysdeps/x86_64/multiarch/strlen-avx2.S > index 0593fb303b..b9b58ef599 100644 > --- a/sysdeps/x86_64/multiarch/strlen-avx2.S > +++ b/sysdeps/x86_64/multiarch/strlen-avx2.S > @@ -544,14 +544,11 @@ L(return_vzeroupper): > L(cross_page_less_vec): > tzcntl %eax, %eax > # ifdef USE_AS_WCSLEN > - /* NB: Multiply length by 4 to get byte count. */ > - sall $2, %esi > + /* NB: Divide by 4 to convert from byte-count to length. */ > + shrl $2, %eax > # endif > cmpq %rax, %rsi > cmovb %esi, %eax > -# ifdef USE_AS_WCSLEN > - shrl $2, %eax > -# endif > VZEROUPPER_RETURN > # endif > > -- > 2.34.1 > LGTM. Thanks. -- H.J.