Excludes: Fix bug with escapes in the regex, add tests
authorChristian Kamm <mail@ckamm.de>
Thu, 5 Oct 2017 08:37:50 +0000 (10:37 +0200)
committerChristian Kamm <mail@ckamm.de>
Thu, 5 Oct 2017 08:40:53 +0000 (10:40 +0200)
src/csync/csync_exclude.cpp
test/csync/csync_tests/check_csync_exclude.cpp

index 8419f96ebeb11f5231f97e57589c0c3205d3fed1..6ba643fc7126a0cbad3ed482fa2cd9b9b95184fe 100644 (file)
@@ -463,7 +463,7 @@ void csync_s::TraversalExcludes::prepare(c_strlist_t *excludes)
         if (exclude[0] == '\r') continue; // empty line
 
         /* If an exclude entry contains some fnmatch-ish characters, we use the C-style codepath without QRegularEpression */
-        if (strchr(exclude, '/') || strchr(exclude, '[') || strchr(exclude, '{')) {
+        if (strchr(exclude, '/') || strchr(exclude, '[') || strchr(exclude, '{') || strchr(exclude, '\\')) {
             _csync_exclude_add(&list_patterns_fnmatch, exclude);
             continue;
         }
index 53391d7eb78aaedae423f151e60eba8aa8285c5f..d7e9f402fdc2a4f726d6119bc66573020f479095 100644 (file)
@@ -237,6 +237,30 @@ static void check_csync_excluded(void **state)
     assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
     rc = csync_excluded_no_ctx(csync->excludes, "bond0071", CSYNC_FTW_TYPE_FILE);
     assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
+
+#ifndef _WIN32
+    /* brackets */
+    _csync_exclude_add( &(csync->excludes), "a [bc] d" );
+    csync_exclude_traversal_prepare(csync);
+    rc = csync_excluded_no_ctx(csync->excludes, "a d d", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
+    rc = csync_excluded_no_ctx(csync->excludes, "a  d", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
+    rc = csync_excluded_no_ctx(csync->excludes, "a b d", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
+    rc = csync_excluded_no_ctx(csync->excludes, "a c d", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
+#endif
+
+    /* escapes */
+    _csync_exclude_add( &(csync->excludes), "\\a \\* \\?" );
+    csync_exclude_traversal_prepare(csync);
+    rc = csync_excluded_no_ctx(csync->excludes, "\\a \\* \\?", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
+    rc = csync_excluded_no_ctx(csync->excludes, "a b c", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
+    rc = csync_excluded_no_ctx(csync->excludes, "a * ?", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
 }
 
 static void check_csync_excluded_traversal(void **state)
@@ -426,6 +450,29 @@ static void check_csync_excluded_traversal(void **state)
     rc = csync_excluded_traversal(csync, "bond0071", CSYNC_FTW_TYPE_FILE);
     assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
 
+#ifndef _WIN32
+    /* brackets */
+    _csync_exclude_add( &(csync->excludes), "a [bc] d" );
+    csync_exclude_traversal_prepare(csync);
+    rc = csync_excluded_traversal(csync, "a d d", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
+    rc = csync_excluded_traversal(csync, "a  d", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
+    rc = csync_excluded_traversal(csync, "a b d", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
+    rc = csync_excluded_traversal(csync, "a c d", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
+#endif
+
+    /* escapes */
+    _csync_exclude_add( &(csync->excludes), "\\a \\* \\?" );
+    csync_exclude_traversal_prepare(csync);
+    rc = csync_excluded_traversal(csync, "\\a \\* \\?", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
+    rc = csync_excluded_traversal(csync, "a b c", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_NOT_EXCLUDED);
+    rc = csync_excluded_traversal(csync, "a * ?", CSYNC_FTW_TYPE_FILE);
+    assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
 }
 
 static void check_csync_pathes(void **state)