diff options
author | Jeremy Allison <jra@samba.org> | 2007-04-04 23:33:07 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:19:10 -0500 |
commit | 7a70d9cc877326ad1828e0a80716507e77936ac4 (patch) | |
tree | d340c068a5534abd52407b5b6c6c39531fb27e4f /source3 | |
parent | 4899c6b8069885df517de00b9608adb70c4a58be (diff) | |
download | samba-7a70d9cc877326ad1828e0a80716507e77936ac4.tar.gz samba-7a70d9cc877326ad1828e0a80716507e77936ac4.tar.bz2 samba-7a70d9cc877326ad1828e0a80716507e77936ac4.zip |
r22080: Fix directory recycle module bug #4486.
Jeremy.
(This used to be commit 17b1d11bbb8353e309c8410128a3e9c5964ea766)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/modules/vfs_recycle.c | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/source3/modules/vfs_recycle.c b/source3/modules/vfs_recycle.c index 579cc94cf9..a20e09f010 100644 --- a/source3/modules/vfs_recycle.c +++ b/source3/modules/vfs_recycle.c @@ -311,23 +311,48 @@ done: } /** - * Check if needle is contained exactly in haystack - * @param haystack list of parameters separated by delimimiter character - * @param needle string to be matched exactly to haystack - * @return True if found + * Check if any of the components of "exclude_list" are contained in path. + * Return True if found **/ -static BOOL checkparam(const char **haystack_list, const char *needle) + +static BOOL matchdirparam(const char **dir_exclude_list, char *path) { - int i; + char *startp = NULL, *endp = NULL; - if (haystack_list == NULL || haystack_list[0] == NULL || - *haystack_list[0] == '\0' || needle == NULL || *needle == '\0') { + if (dir_exclude_list == NULL || dir_exclude_list[0] == NULL || + *dir_exclude_list[0] == '\0' || path == NULL || *path == '\0') { return False; } - for(i=0; haystack_list[i] ; i++) { - if(strequal(haystack_list[i], needle)) { - return True; + /* + * Walk the components of path, looking for matches with the + * exclude list on each component. + */ + + for (startp = path; startp; startp = endp) { + int i; + + while (*startp == '/') { + startp++; + } + endp = strchr(startp, '/'); + if (endp) { + *endp = '\0'; + } + + for(i=0; dir_exclude_list[i] ; i++) { + if(unix_wild_match(dir_exclude_list[i], startp)) { + /* Repair path. */ + if (endp) { + *endp = '/'; + } + return True; + } + } + + /* Repair path. */ + if (endp) { + *endp = '/'; } } @@ -485,11 +510,7 @@ static int recycle_unlink(vfs_handle_struct *handle, const char *file_name) goto done; } - /* FIXME: this check will fail if we have more than one level of directories, - * we shoud check for every level 1, 1/2, 1/2/3, 1/2/3/4 .... - * ---simo - */ - if (checkparam(recycle_exclude_dir(handle), path_name)) { + if (matchdirparam(recycle_exclude_dir(handle), path_name)) { DEBUG(3, ("recycle: directory %s is excluded \n", path_name)); rc = SMB_VFS_NEXT_UNLINK(handle, file_name); goto done; |