From patchwork Tue Sep 5 20:25:22 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: 810285 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-84216-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="RE9SAcqs"; 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 3xmyvJ5cVSz9sPs for ; Wed, 6 Sep 2017 06:27:40 +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:cc:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=Rr9eUcmuiurdUQdn7TBWpyUencv7nDm b0kESQLTARYJXIAMrMgQNFo6WCxJCeTHrL3xnm5UaOlcA/0xKsqe/UwfEhCnlBmt j1+gXhqNLwRq4lPDrJarTR1pm15sT2MJwtCHsU6tmBheWgUtBKIfIT9EW106Wv16 E/J4CH0ehpWA= 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:cc:subject:date:message-id:in-reply-to :references; s=default; bh=r5pvJkGhNDRzvlyhiDJzFiWqMNw=; b=RE9SA cqsK/7hZXjq+DEV4+qO8QBTcWIeQEDqX4sqNR0Z2viTqG6Ey3q5k6KydY90ccTJ5 NOYJIBZ1z+qthz4HAWSVo/kQsTp+g4LVJnOqamOSTPdXrNKvm0tJr+a1U8jb8tpr fdArcdonJajH98W6ZLnXZXfUFb/SWmUBDzipdY= Received: (qmail 51261 invoked by alias); 5 Sep 2017 20:25:59 -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 50633 invoked by uid 89); 5 Sep 2017 20:25:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-27.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=responsable, 2728, Hx-languages-length:3671 X-HELO: mail-qt0-f179.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:cc:subject:date:message-id:in-reply-to :references; bh=7QXjKJO8zzOSdkRYK7Gp21lxzE7yhu//UewS53dVdJY=; b=tplxf5XaSwWiBrUeBb9rW6Em3DuscJsE6zv5G7BgngQ90+V0am1KSdyKOFzGjMUiyb WK5dSkglCD3jTS9tG+AgJdY7lVs3uvlACWGBtNUO4LRS/MjGZCgoUPvQtIJ/Xavvqn/8 5jSkBQ9cqu6rUQgiofB7UcAYBDExMbPHvIMJQG17oASkrJvmFPaVG1B6hqTPBK1TpjxT rux9L/6OgNn6if5WWjY4V6hPxMsVUKhvpHgyg2YBhVdZJDEk3qTissytM1rAbfMSj70I AXK86QctT/c8uXtfNiv4TbWbFxMXwx4HAKjFGcMmO6rTo9HRrxdjOpdjda2rScv40ss6 PUqw== X-Gm-Message-State: AHPjjUiV/RtzeQ3/grJoBxHTSsbyOO8r5ZxNAW09+ydXgOsg/yWaM5kw BXXvxaB1jqwILjXjxXOzbw== X-Google-Smtp-Source: ADKCNb5AsVso9ORimOJeC4SVW44hZQ7SJpmX2DL1Gy01P237rLhUgcII5ruCMHabjJ0y4RUq/bVAew== X-Received: by 10.200.11.13 with SMTP id e13mr446688qti.215.1504643148958; Tue, 05 Sep 2017 13:25:48 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Cc: Paul Eggert Subject: [PATCH 9/9] posix: Fix glob with GLOB_NOCHECK returning modified patterns (BZ#10246) Date: Tue, 5 Sep 2017 17:25:22 -0300 Message-Id: <1504643122-14874-10-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1504643122-14874-1-git-send-email-adhemerval.zanella@linaro.org> References: <1504643122-14874-1-git-send-email-adhemerval.zanella@linaro.org> According 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 and on a build using build-many-glibcs.py for all major architectures. [BZ #10246] * posix/glob.c (glob): Handle pattern that do not match and start with '/' correctly. * posix/globtest.sh: New tests for NOCHECK. --- ChangeLog | 7 ++++++- posix/glob.c | 13 +++++++------ posix/globtest.sh | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/posix/glob.c b/posix/glob.c index 30a4143..25c5d24 100644 --- a/posix/glob.c +++ b/posix/glob.c @@ -272,6 +272,8 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), size_t oldcount; int meta; int dirname_modified; + /* Indicate if the directory should be prepended on return values. */ + bool dirname_prefix = true; int malloc_dirname = 0; glob_t dirs; int retval = 0; @@ -495,6 +497,10 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), dirname = (char *) "/"; 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 { @@ -1086,7 +1092,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 (dirname, + if (prefix_array (dirname_prefix ? dirname : "", &pglob->gl_pathv[old_pathc + pglob->gl_offs], pglob->gl_pathc - old_pathc)) { @@ -1167,11 +1173,6 @@ prefix_array (const char *dirname, char **array, size_t n) size_t dirlen = strlen (dirname); char dirsep_char = '/'; - 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 if (dirlen > 1) { diff --git a/posix/globtest.sh b/posix/globtest.sh index 73f7ae3..92a8e37 100755 --- a/posix/globtest.sh +++ b/posix/globtest.sh @@ -242,6 +242,43 @@ 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} \