From patchwork Tue Aug 14 15:46:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 957571 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-95247-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="Rrf+OfKU"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41qcR148Tcz9s5b for ; Wed, 15 Aug 2018 01:46:52 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:date:to:subject:mime-version:content-type :content-transfer-encoding:message-id:from; q=dns; s=default; b= sJj+UUuNdQTlrXWdR/pI3OKh4g4DCklB9IYpFdtpCv/1oBzqFk8Wyzoj79LVF4gE S6kzeBd4H4rQKQGP9/SYF6rrgHy9bPTJbi2rHyR9OBm+Du/wV89lFjn7bK8gGuum si0LAluh0ahusy0/GA7mb3DLbtxi/zMXQt/B661RvuQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:date:to:subject:mime-version:content-type :content-transfer-encoding:message-id:from; s=default; bh=zVqwVD Y3bhLNxESr4Y6q9gpn48Y=; b=Rrf+OfKUfciIFrFyp7ZcgWP1m+mxGUPCPQEz4F fcd+nsyZqyJPBwT0eTrEv2gjHf6F2c+pGe20VhM352NB6j1HLwQ0G92Xfro/Q2b5 ZZ4/VPNuvKfBtdjrV2Z9sN9olkxHrEbPHcyafvYE5yn/gfJO5Ds+LQ8M3hA2nVPk jwo8U= Received: (qmail 49875 invoked by alias); 14 Aug 2018 15:46:46 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 49863 invoked by uid 89); 14 Aug 2018 15:46:45 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Date: Tue, 14 Aug 2018 17:46:42 +0200 To: libc-alpha@sourceware.org Subject: [PATCH] fnmatch: Use __mbstowcs_alloc [BZ #23519] User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Message-Id: <20180814154642.09826405971F7@oldenburg.str.redhat.com> From: fweimer@redhat.com (Florian Weimer) 2018-08-14 Florian Weimer [BZ #23519] * posix/fnmatch.c [HANDLE_MULTIBYTE] (fnmatch): Use __mbstowcs_alloc. diff --git a/posix/fnmatch.c b/posix/fnmatch.c index a9b762624f..d2a86839c6 100644 --- a/posix/fnmatch.c +++ b/posix/fnmatch.c @@ -325,119 +325,28 @@ fnmatch (const char *pattern, const char *string, int flags) mbstate_t ps; size_t n; const char *p; - wchar_t *wpattern_malloc = NULL; - wchar_t *wpattern; - wchar_t *wstring_malloc = NULL; - wchar_t *wstring; - size_t alloca_used = 0; - /* Convert the strings into wide characters. */ - memset (&ps, '\0', sizeof (ps)); - p = pattern; -#ifdef _LIBC - n = __strnlen (pattern, 1024); -#else - n = strlen (pattern); -#endif - if (__glibc_likely (n < 1024)) - { - wpattern = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t), - alloca_used); - n = mbsrtowcs (wpattern, &p, n + 1, &ps); - if (__glibc_unlikely (n == (size_t) -1)) - /* Something wrong. - XXX Do we have to set `errno' to something which mbsrtows hasn't - already done? */ - return -1; - if (p) - { - memset (&ps, '\0', sizeof (ps)); - goto prepare_wpattern; - } - } - else - { - prepare_wpattern: - n = mbsrtowcs (NULL, &pattern, 0, &ps); - if (__glibc_unlikely (n == (size_t) -1)) - /* Something wrong. - XXX Do we have to set `errno' to something which mbsrtows hasn't - already done? */ - return -1; - if (__glibc_unlikely (n >= (size_t) -1 / sizeof (wchar_t))) - { - __set_errno (ENOMEM); - return -2; - } - wpattern_malloc = wpattern - = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t)); - assert (mbsinit (&ps)); - if (wpattern == NULL) - return -2; - (void) mbsrtowcs (wpattern, &pattern, n + 1, &ps); - } + void *to_free1; + wchar_t wpattern_scratch[256]; + wchar_t *wpattern = __mbstowcs_alloc + (pattern, wpattern_scratch, array_length (wpattern_scratch), &to_free1); + if (wpattern == NULL) + return -1; - assert (mbsinit (&ps)); -#ifdef _LIBC - n = __strnlen (string, 1024); -#else - n = strlen (string); -#endif - p = string; - if (__glibc_likely (n < 1024)) + void *to_free2; + wchar_t wstring_scratch[256]; + wchar_t *wstring = __mbstowcs_alloc + (string, wstring_scratch, array_length (wstring_scratch), &to_free2); + if (wstring == NULL) { - wstring = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t), - alloca_used); - n = mbsrtowcs (wstring, &p, n + 1, &ps); - if (__glibc_unlikely (n == (size_t) -1)) - { - /* Something wrong. - XXX Do we have to set `errno' to something which - mbsrtows hasn't already done? */ - free_return: - free (wpattern_malloc); - return -1; - } - if (p) - { - memset (&ps, '\0', sizeof (ps)); - goto prepare_wstring; - } + free (to_free1); + return -1; } - else - { - prepare_wstring: - n = mbsrtowcs (NULL, &string, 0, &ps); - if (__glibc_unlikely (n == (size_t) -1)) - /* Something wrong. - XXX Do we have to set `errno' to something which mbsrtows hasn't - already done? */ - goto free_return; - if (__glibc_unlikely (n >= (size_t) -1 / sizeof (wchar_t))) - { - free (wpattern_malloc); - __set_errno (ENOMEM); - return -2; - } - - wstring_malloc = wstring - = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t)); - if (wstring == NULL) - { - free (wpattern_malloc); - return -2; - } - assert (mbsinit (&ps)); - (void) mbsrtowcs (wstring, &string, n + 1, &ps); - } - - int res = internal_fnwmatch (wpattern, wstring, wstring + n, - flags & FNM_PERIOD, flags, NULL, - alloca_used); - - free (wstring_malloc); - free (wpattern_malloc); + int res = internal_fnwmatch (wpattern, wstring, wstring + wcslen (wstring), + flags & FNM_PERIOD, flags, NULL, 0); + free (to_free2); + free (to_free1); return res; } # endif /* mbstate_t and mbsrtowcs or _LIBC. */