Commit d18c5775 authored by Ralph Boehme's avatar Ralph Boehme Committed by Karolin Seeger

vfs_shadow_copy2: in fstat also convert fsp->fsp_name and fsp->base_fsp->fsp_name

Stacked VFS modules might use the file name, not the file
handle. Looking at you, vfs_fruit...

Bug: https://bugzilla.samba.org/show_bug.cgi?id=13455Signed-off-by: default avatarRalph Boehme <slow@samba.org>
Reviewed-by: default avatarJeremy Allison <jra@samba.org>
(cherry picked from commit aa1fac69)

Autobuild-User(v4-9-test): Karolin Seeger <kseeger@samba.org>
Autobuild-Date(v4-9-test): Thu Dec 13 16:47:40 CET 2018 on sn-devel-144
parent fa2a9c3b
^samba3.blackbox.shadow_copy_torture.reading stream of a shadow copy of a file\(fileserver\)
......@@ -1354,21 +1354,63 @@ static int shadow_copy2_fstat(vfs_handle_struct *handle, files_struct *fsp,
SMB_STRUCT_STAT *sbuf)
{
time_t timestamp = 0;
struct smb_filename *orig_smb_fname = NULL;
struct smb_filename vss_smb_fname;
struct smb_filename *orig_base_smb_fname = NULL;
struct smb_filename vss_base_smb_fname;
char *stripped = NULL;
int saved_errno = 0;
bool ok;
int ret;
ok = shadow_copy2_strip_snapshot(talloc_tos(), handle,
fsp->fsp_name->base_name,
&timestamp, &stripped);
if (!ok) {
return -1;
}
if (timestamp == 0) {
TALLOC_FREE(stripped);
return SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf);
}
vss_smb_fname = *fsp->fsp_name;
vss_smb_fname.base_name = shadow_copy2_convert(talloc_tos(),
handle,
stripped,
timestamp);
TALLOC_FREE(stripped);
if (vss_smb_fname.base_name == NULL) {
return -1;
}
orig_smb_fname = fsp->fsp_name;
fsp->fsp_name = &vss_smb_fname;
if (fsp->base_fsp != NULL) {
vss_base_smb_fname = *fsp->base_fsp->fsp_name;
vss_base_smb_fname.base_name = vss_smb_fname.base_name;
orig_base_smb_fname = fsp->base_fsp->fsp_name;
fsp->base_fsp->fsp_name = &vss_base_smb_fname;
}
ret = SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf);
if (ret == -1) {
return ret;
fsp->fsp_name = orig_smb_fname;
if (fsp->base_fsp != NULL) {
fsp->base_fsp->fsp_name = orig_base_smb_fname;
}
if (!shadow_copy2_strip_snapshot(talloc_tos(), handle,
fsp->fsp_name->base_name,
&timestamp, NULL)) {
return 0;
if (ret == -1) {
saved_errno = errno;
}
if (timestamp != 0) {
if (ret == 0) {
convert_sbuf(handle, fsp->fsp_name->base_name, sbuf);
}
return 0;
if (saved_errno != 0) {
errno = saved_errno;
}
return ret;
}
static int shadow_copy2_open(vfs_handle_struct *handle,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment