Excludes: Fix bug with escapes in the regex, add tests

This commit is contained in:
Christian Kamm 2017-10-05 10:37:50 +02:00 committed by Roeland Jago Douma
parent f609ea3bef
commit 01bbbb7d08
No known key found for this signature in database
GPG key ID: F941078878347C0C
2 changed files with 48 additions and 1 deletions

View file

@ -463,7 +463,7 @@ void csync_s::TraversalExcludes::prepare(c_strlist_t *excludes)
if (exclude[0] == '\r') continue; // empty line 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 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); _csync_exclude_add(&list_patterns_fnmatch, exclude);
continue; continue;
} }

View file

@ -237,6 +237,30 @@ static void check_csync_excluded(void **state)
assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST); assert_int_equal(rc, CSYNC_FILE_EXCLUDE_LIST);
rc = csync_excluded_no_ctx(csync->excludes, "bond0071", CSYNC_FTW_TYPE_FILE); rc = csync_excluded_no_ctx(csync->excludes, "bond0071", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED); 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) 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); rc = csync_excluded_traversal(csync, "bond0071", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_NOT_EXCLUDED); 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) static void check_csync_pathes(void **state)