From patchwork Fri Aug 11 14:50:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 109898 Delivered-To: patch@linaro.org Received: by 10.182.109.195 with SMTP id hu3csp978158obb; Fri, 11 Aug 2017 07:54:24 -0700 (PDT) X-Received: by 10.84.231.203 with SMTP id g11mr18227558pln.199.1502463264826; Fri, 11 Aug 2017 07:54:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1502463264; cv=none; d=google.com; s=arc-20160816; b=qr0GH+QES8XvPY5SHGADsj2JbbRhFI+GBJOqi9yqCpO+cCxeq6a2xuyZnyUH20NS+8 ufwKHEKArtExPsXBMoyYvDsKRJRij+Covx96UBrWy9B1zre4Lvltp/dKnai5lC/9DiDr azdPaLtfovRBX2s5rMg8mCnqjGRa00somVjKFNcNFF5PPSaz0gsib6kjdJMmSbc3c+ji oBDOfzH2R+HSCiqtOJw1D+iQx75iIY1jWsLdwTNPRXUtIUyVaAAFLb6Tri2v8KmYRfJ1 TkwBQLqXWgfsyZF1autOmEUP7f/y7Cm0YcCVKkfHSORiA0xsRA+8vERdvVJwTHR61jEK HIDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=0fmnDCt229yp970SjfMbSIG9kWdgX+gZCikOtbkqFrY=; b=EpBF4/xRI7KSuDEBcRW2vnbUbc4VGDPzKpJWMdhUw6SOZv21W+HPnGQPbkoQkydvLl umEAW7cGYMvaiU+tMU+IHCaDzPmnE7YoUAQMTVTJfeDSSZpEKsucOiRSVVNf6jE/lDpa wi3cHLi8Q5PRNl08VkF7lBGVUvsPbzCdJQnDLeB1dMCXbTP6z9bW9ZX8r1yX6psPYmyQ 4Ixl8a4Ifm6XDgKjbkLA9e8SHf6WSTLKtd8XCvU2/Y0LnuT88m6oDcwR2nUNZMKKrYCc ODliu4Qw9oGTaP5r18Y0znfI6pWFdhMRTndBHRB5+9yQtCDUTSJp2pw85gWvcQkCJsQ+ 6JpA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=IPcv0B1G; spf=pass (google.com: domain of libc-alpha-return-83040-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-83040-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id p1si665237pld.308.2017.08.11.07.54.24 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Aug 2017 07:54:24 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-83040-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=IPcv0B1G; spf=pass (google.com: domain of libc-alpha-return-83040-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-83040-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=r8Sri4Iw9cSVLa7TDX6IxotmXTILrPB kpTelgYps/Mpe+wVSOaqhPKQ/TxUrkmGHA8ZLheL9HbC8bP4TMfmkeIPbWwl6na6 gn14dKGAnGhSTUCH7XNVKNsQGijeRNwOyGlWI504MQ/HDLA91xx8ikI0UWZXpE0z Ej3m5SyselOA= 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:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=BcPfy6rzE1JNB20J0LI3QwNGGpQ=; b=IPcv0 B1Gg4dPm/vZd1lMY6kjfK4pzMjB2MB/7kjyR8/2az/RrffMwU216B3IyYAm/zuMC 8EYKXcb6bjaT0i0x7jBqLuE57g3YulslBOb7KFMd/vJGcvcHFZ4EqLp81idvSCwp dyrYoKMsZhcoWQ4KqNBxOpnK48csiSNY0hsjK0= Received: (qmail 90966 invoked by alias); 11 Aug 2017 14:51:35 -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 82661 invoked by uid 89); 11 Aug 2017 14:51:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-27.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=responsable, consisting X-HELO: mail-qt0-f181.google.com 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; bh=0fmnDCt229yp970SjfMbSIG9kWdgX+gZCikOtbkqFrY=; b=bquyM3E7OOBncNfNw2+CcXp9cQpWdb7uGx5gVYtcSKhDg6aXdOsv9+0ej1KgNn54E/ Ljh8paSVMYsGPi3UBEMjY7fCC+CwjTGssRYfVUP8VpDWVoHYJyl2DXpekQQ5f5WMiTJR 4O6KtL69qfPP+dRDJZhaLMObfJ0rj1oFqAgZDj4fAuETA8V2wJEH0nqA0deNQ7mSm1HB o3bCwRMglHXw/hwpcYWVVLIhYuHCQcE3UIQeDhUNI1CK3dYuqdATmIUw6fhlgitYPnja mz0JsOTi9R9pKGJBmyGKYWLEJton+ZxXPp/Sw/ezah5EvkPBYwqev1Qe/cLsfBi3N1A/ F4Pg== X-Gm-Message-State: AHYfb5iurBDp1ynmOuQCSIvFvAogUyVwQiO3mj9w2/uaePTd26er74N+ 60wq1U0qboSvxPIjeLLf6g== X-Received: by 10.200.8.106 with SMTP id x39mr22645601qth.309.1502463076513; Fri, 11 Aug 2017 07:51:16 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 18/18] posix: Fix glob with GLOB_NOCHECK returning modified patterns (BZ#10246) Date: Fri, 11 Aug 2017 11:50:44 -0300 Message-Id: <1502463044-4042-19-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1502463044-4042-1-git-send-email-adhemerval.zanella@linaro.org> References: <1502463044-4042-1-git-send-email-adhemerval.zanella@linaro.org> Acconding to POSIX glob with GLOB_NOCHECK should return a list consisting of only of the input pattern in case of no match. However GLIBC does not honor in case of '//' or '//' will be handle in same way. This patch fix it by using a empty directory name for the latter (since prefix_array already adds a slash as default for each entry). Checked on x86_64-linux-gnu. [BZ #10246] * posix/glob.c (glob): Handle pattern that do not match and start with '/' correctly. * posix/globtest.sh: New tests for NOCHECK. --- posix/glob.c | 14 ++++++++------ posix/globtest.sh | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) -- 2.7.4 diff --git a/posix/glob.c b/posix/glob.c index 37e8702..3f85586 100644 --- a/posix/glob.c +++ b/posix/glob.c @@ -358,6 +358,8 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), size_t oldcount; int meta; bool dirname_modified; + /* Indicate if the directory should be prepended on return values. */ + bool dirname_prefix = true; glob_t dirs; int retval = 0; struct char_array dirname; @@ -591,6 +593,10 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), goto err_nospace; dirlen = 1; ++filename; + /* prefix_array adds a separator for each result and DIRNAME is + already '/'. So we indicate later that we should not prepend + anything for this specific case. */ + dirname_prefix = false; } else { @@ -1101,7 +1107,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), if (dirlen > 0) { /* Stick the directory on the front of each name. */ - if (prefix_array (char_array_str (&dirname), + if (prefix_array (dirname_prefix ? char_array_str (&dirname) : "", &pglob->gl_pathv[old_pathc + pglob->gl_offs], pglob->gl_pathc - old_pathc)) { @@ -1198,12 +1204,8 @@ prefix_array (const char *dirname, char **array, size_t n) # define DIRSEP_CHAR '/' #endif - if (dirlen == 1 && dirname[0] == '/') - /* DIRNAME is just "/", so normal prepending would get us "//foo". - We want "/foo" instead, so don't prepend any chars from DIRNAME. */ - dirlen = 0; #if defined __MSDOS__ || defined WINDOWS32 - else if (dirlen > 1) + if (dirlen > 1) { if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':') /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */ diff --git a/posix/globtest.sh b/posix/globtest.sh index 73f7ae3..938bc47 100755 --- a/posix/globtest.sh +++ b/posix/globtest.sh @@ -242,6 +242,42 @@ if test $failed -ne 0; then result=1 fi +# Test NOCHECK for specific cases where the pattern used starts +# with '/' (BZ#10246). +failed=0 +${test_program_prefix} \ +${common_objpfx}posix/globtest -c "$testdir" "/%" | +sort > $testout +cat <<"EOF" | $CMP - $testout >> $logfile || failed=1 +`/%' +EOF +if test $failed -ne 0; then + echo "No check test failed" >> $logfile + result=1 +fi + +${test_program_prefix} \ +${common_objpfx}posix/globtest -c "$testdir" "//%" | +sort > $testout +cat <<"EOF" | $CMP - $testout >> $logfile || failed=1 +`//%' +EOF +if test $failed -ne 0; then + echo "No check test failed" >> $logfile + result=1 +fi + +${test_program_prefix} \ +${common_objpfx}posix/globtest -c "$testdir" "///%" | +sort > $testout +cat <<"EOF" | $CMP - $testout >> $logfile || failed=1 +`///%' +EOF +if test $failed -ne 0; then + echo "No check test failed" >> $logfile + result=1 +fi + # Test NOMAGIC without magic characters failed=0 ${test_program_prefix} \