]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix typos in archive_pathmatch logic.
authorTim Kientzle <kientzle@acm.org>
Mon, 15 Dec 2014 04:14:19 +0000 (20:14 -0800)
committerTim Kientzle <kientzle@acm.org>
Mon, 15 Dec 2014 04:14:19 +0000 (20:14 -0800)
This was explored in pull request #78 by github user maksqwe.
After considering the alternatives, I think the existing
behavior was correct (but the comments were wrong and there was
extraneous code).  Extended tests to cover this case and some
other cases that were not fully exercised.

libarchive/archive_pathmatch.c
libarchive/test/test_archive_pathmatch.c

index 505252a18f3873dbfb7cb7af2383c4be6df2fa09..619e2b622a3ca0c596c02cf0ce3971d83b2e9df0 100644 (file)
@@ -394,8 +394,8 @@ __archive_pathmatch(const char *p, const char *s, int flags)
        if (*p == '/' && *s != '/')
                return (0);
 
-       /* Certain patterns and file names anchor implicitly. */
-       if (*p == '*' || *p == '/' || *p == '/') {
+       /* Certain patterns anchor implicitly. */
+       if (*p == '*' || *p == '/') {
                while (*p == '/')
                        ++p;
                while (*s == '/')
@@ -434,8 +434,8 @@ __archive_pathmatch_w(const wchar_t *p, const wchar_t *s, int flags)
        if (*p == L'/' && *s != L'/')
                return (0);
 
-       /* Certain patterns and file names anchor implicitly. */
-       if (*p == L'*' || *p == L'/' || *p == L'/') {
+       /* Certain patterns anchor implicitly. */
+       if (*p == L'*' || *p == L'/') {
                while (*p == L'/')
                        ++p;
                while (*s == L'/')
index fed6ad781f2f372529a3ce8aeafbdec3440c3176..21cbdd7e078031f3fdf9857d9d2958c3e5d2cf4e 100644 (file)
@@ -207,11 +207,26 @@ DEFINE_TEST(test_archive_pathmatch)
            archive_pathmatch("^bcd", "abcd", PATHMATCH_NO_ANCHOR_START));
        assertEqualInt(1,
            archive_pathmatch("b/c/d", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
+       assertEqualInt(0,
+           archive_pathmatch("^b/c/d", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
+       assertEqualInt(0,
+           archive_pathmatch("/b/c/d", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
+       assertEqualInt(0,
+           archive_pathmatch("a/b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
+       assertEqualInt(1,
+           archive_pathmatch("a/b/c/d", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
        assertEqualInt(0,
            archive_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
        assertEqualInt(0,
            archive_pathmatch("^b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
 
+
+       assertEqualInt(1,
+           archive_pathmatch("b/c/d", "a/b/c/d", PATHMATCH_NO_ANCHOR_START));
+       assertEqualInt(1,
+           archive_pathmatch("b/c/d", "/a/b/c/d", PATHMATCH_NO_ANCHOR_START));
+
+
        /* Matches not anchored at end. */
        assertEqualInt(0,
            archive_pathmatch("bcd", "abcd", PATHMATCH_NO_ANCHOR_END));
@@ -241,4 +256,30 @@ DEFINE_TEST(test_archive_pathmatch)
            archive_pathmatch("a/b/c/$", "a/b/c", PATHMATCH_NO_ANCHOR_END));
        assertEqualInt(0,
            archive_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_END));
+
+       /* Matches not anchored at either end. */
+       assertEqualInt(1,
+           archive_pathmatch("b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(0,
+           archive_pathmatch("/b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(0,
+           archive_pathmatch("/a/b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(1,
+           archive_pathmatch("/a/b/c", "/a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(0,
+           archive_pathmatch("/a/b/c$", "a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(0,
+           archive_pathmatch("/a/b/c/d$", "a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(0,
+           archive_pathmatch("/a/b/c/d$", "/a/b/c/d/e", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(1,
+           archive_pathmatch("/a/b/c/d$", "/a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(1,
+           archive_pathmatch("^a/b/c", "a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(0,
+           archive_pathmatch("^a/b/c$", "a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(0,
+           archive_pathmatch("a/b/c$", "a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
+       assertEqualInt(1,
+           archive_pathmatch("b/c/d$", "a/b/c/d", PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
 }