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: 800616 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-83040-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="VhjQFWUd"; 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 3xTShD0C7fz9sRq for ; Sat, 12 Aug 2017 00:54:19 +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:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=HTNlnjejg5iRbl1SGIZXxuP8vwl0m3K nA75U2nvlZefUHlCSfOgJqu07ctdJ7DjZYY2KqpyYlpaeGgC4YnjQX3Sv6X3tizp DZJuh1N9k9xA9vxKMo9D3QV/fja4ysS/DahYTP08v4py4YgqChxIJri7+2SrNz19 0gwHNtwD880E= 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=VhjQF WUdMSu7ivCFPmVjLcshJwNW79RFkn7bMYqA8U/VYCPc0dSKJDG6XpuNiQsYmmpr9 NLnD2xHLG2P72A4xS/TlAus0Dw2TeVOlqDfmhjyg59ifvp04HgSrAOjkmHOoc+iy nS7iwf38x2OqVhdVKfKxmNyCV6Nk7SwUnGh+Jg= 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(-) 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} \