diff options
author | Uri Simchoni <uri@samba.org> | 2016-08-24 14:42:23 +0300 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2016-09-20 10:10:18 +0200 |
commit | 26a23214a93e0bbacc77f8f5947632a4e5fd3b66 (patch) | |
tree | 257bb5a9a692938ba1948dc44f59864d61bf732c | |
parent | 2a4de134c8753cf10626faa121848f3709198b3d (diff) | |
download | samba-26a23214a93e0bbacc77f8f5947632a4e5fd3b66.tar.gz |
vfs_shadow_copy: handle non-existant files and wildcards
During path checking, the vfs connectpath_fn is called to
determine the share's root, relative to the file being
queried (for example, in snapshot file this may be other
than the share's "usual" root directory). connectpath_fn
must be able to answer this question even if the path does
not exist and its parent does exist. The convention in this
case is that this refers to a yet-uncreated file under the parent
and all queries are relative to the parent.
This also serves as a workaround for the case where connectpath_fn
has to handle wildcards, as with the case of SMB1 trans2 findfirst.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=12172
Signed-off-by: Uri Simchoni <uri@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Thu Aug 25 05:35:29 CEST 2016 on sn-devel-144
(cherry picked from commit f41f439335efb352d03a842c370212a0af77262a)
-rw-r--r-- | selftest/knownfail | 2 | ||||
-rw-r--r-- | source3/modules/vfs_shadow_copy2.c | 31 |
2 files changed, 30 insertions, 3 deletions
diff --git a/selftest/knownfail b/selftest/knownfail index 68bd08201b0..40ac69657b4 100644 --- a/selftest/knownfail +++ b/selftest/knownfail @@ -344,5 +344,3 @@ ^samba4.smb2.read.access #ntvfs server blocks copychunk with execute access on read handle ^samba4.smb2.ioctl.copy_chunk_bad_access -#new snapshot dir listing test fails on SMB1 -^samba3.blackbox.shadow_copy2(?!.*wide links).*- list directory diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c index 7ecdda585e7..1f38b85fabd 100644 --- a/source3/modules/vfs_shadow_copy2.c +++ b/source3/modules/vfs_shadow_copy2.c @@ -1793,6 +1793,7 @@ static const char *shadow_copy2_connectpath(struct vfs_handle_struct *handle, char *stripped = NULL; char *tmp = NULL; char *result = NULL; + char *parent_dir = NULL; int saved_errno; size_t rootpath_len = 0; @@ -1809,7 +1810,34 @@ static const char *shadow_copy2_connectpath(struct vfs_handle_struct *handle, tmp = shadow_copy2_do_convert(talloc_tos(), handle, stripped, timestamp, &rootpath_len); if (tmp == NULL) { - goto done; + if (errno != ENOENT) { + goto done; + } + + /* + * If the converted path does not exist, and converting + * the parent yields something that does exist, then + * this path refers to something that has not been + * created yet, relative to the parent path. + * The snapshot finding is relative to the parent. + * (usually snapshots are read/only but this is not + * necessarily true). + * This code also covers getting a wildcard in the + * last component, because this function is called + * prior to sanitizing the path, and in SMB1 we may + * get wildcards in path names. + */ + if (!parent_dirname(talloc_tos(), stripped, &parent_dir, + NULL)) { + errno = ENOMEM; + goto done; + } + + tmp = shadow_copy2_do_convert(talloc_tos(), handle, parent_dir, + timestamp, &rootpath_len); + if (tmp == NULL) { + goto done; + } } DBG_DEBUG("converted path is [%s] root path is [%.*s]\n", tmp, @@ -1827,6 +1855,7 @@ done: saved_errno = errno; TALLOC_FREE(tmp); TALLOC_FREE(stripped); + TALLOC_FREE(parent_dir); errno = saved_errno; return result; } |