1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-26 21:57:41 +03:00

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)
This commit is contained in:
Uri Simchoni 2016-08-24 14:42:23 +03:00 committed by Stefan Metzmacher
parent 8f535d5055
commit 3157af9bfd
2 changed files with 30 additions and 3 deletions

View File

@ -290,5 +290,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 NT1(?!.*wide links).*- list directory

View File

@ -2207,6 +2207,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;
@ -2223,9 +2224,36 @@ 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) {
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,
(int)rootpath_len, tmp);
@ -2241,6 +2269,7 @@ done:
saved_errno = errno;
TALLOC_FREE(tmp);
TALLOC_FREE(stripped);
TALLOC_FREE(parent_dir);
errno = saved_errno;
return result;
}