[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Sat Feb 13 01:20:01 UTC 2021
The branch, master has been updated
via d05ecd26b94 vfs: update status of SMB_VFS_READLINKAT()
via 0cbb9400809 s3: smbd: Change smb_unix_read_symlink() to use a real directory fsp for SMB_VFS_READLINKAT().
via 92ec8a00970 s3: smbd: Factor out the SMB1 UNIX extensions read symlink code into a function.
via e884793cf28 s3: VFS: unityed_media: Fix um_readlinkat() to cope with real directory fsps.
via 9077983ff91 s3: VFS: time_audit: Fix smb_time_audit_readlinkat() to cope with real directory fsps.
via b1ddc4bb653 3: VFS: snapper: Fix snapper_gmt_readlinkat() to cope with real directory fsps.
via 7973e09fd11 s3: VFS: shadow_copy2: Fix shadow_copy2_readlinkat() to cope with real directory fsps.
via 89f116689da s3: VFS: media_harmony: Fix mh_readlinkat() to cope with real directory fsps.
via 2786a564e6a s3: VFS: glusterfs: Fix vfs_gluster_readlinkat() to cope with real directory fsps.
via b500162b011 s3: VFS: full_audit: Fix smb_full_audit_readlinkat() to cope with real directory fsps.
via 3e256f508c4 s3: VFS: ceph_snapshots: Fix ceph_snap_gmt_readlinkat() to cope with real directory fsps.
via 7933ee403b6 s3: VFS: ceph: Fix cephwrap_readlinkat() to cope with real directory fsps.
via 545ba86581e s3: VFS: cap: Fix cap_readlinkat() to cope with real directory fsps.
via ca6cad5f00b s3: VFS: expand_msdfs: Since we moved to SMB_VFS_READ_DFS_PATHAT() this module has looked at the wrong function.
from b6b6925347c nsswitch pam_winbind: Fix clang compilation error
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit d05ecd26b943d64405643a99ec7ceb9fb73dcb37
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 11:59:06 2021 -0800
vfs: update status of SMB_VFS_READLINKAT()
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Sat Feb 13 01:19:49 UTC 2021 on sn-devel-184
commit 0cbb940080940830acdc4611f75075058fa0468b
Author: Jeremy Allison <jra at samba.org>
Date: Wed Feb 10 14:50:36 2021 -0800
s3: smbd: Change smb_unix_read_symlink() to use a real directory fsp for SMB_VFS_READLINKAT().
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit 92ec8a009703884627a67aa7492c221f1723cda4
Author: Jeremy Allison <jra at samba.org>
Date: Wed Feb 10 13:34:42 2021 -0800
s3: smbd: Factor out the SMB1 UNIX extensions read symlink code into a function.
Will make it much easier to convert to a dirfsp later.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit e884793cf280fe21cfe4c9d003d74342c50f670f
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 11:55:16 2021 -0800
s3: VFS: unityed_media: Fix um_readlinkat() to cope with real directory fsps.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit 9077983ff9114bac227350b60c388bc19cf22bd0
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 11:49:24 2021 -0800
s3: VFS: time_audit: Fix smb_time_audit_readlinkat() to cope with real directory fsps.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit b1ddc4bb65357205fe7a875a66006854df33842d
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 11:43:50 2021 -0800
3: VFS: snapper: Fix snapper_gmt_readlinkat() to cope with real directory fsps.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit 7973e09fd113360a5cb019666a7988fd8a639c37
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 11:36:22 2021 -0800
s3: VFS: shadow_copy2: Fix shadow_copy2_readlinkat() to cope with real directory fsps.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit 89f116689da5a9ff4e62d650c7cbadc1f3c6a13e
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 11:05:28 2021 -0800
s3: VFS: media_harmony: Fix mh_readlinkat() to cope with real directory fsps.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit 2786a564e6afcc678347b616ab2ab0a8cca58d18
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 11:02:28 2021 -0800
s3: VFS: glusterfs: Fix vfs_gluster_readlinkat() to cope with real directory fsps.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit b500162b0118b61c1ef702f489dc83f1ce3e2571
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 10:59:18 2021 -0800
s3: VFS: full_audit: Fix smb_full_audit_readlinkat() to cope with real directory fsps.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit 3e256f508c4529a6ba61945029de525cbc0db6b2
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 09:54:52 2021 -0800
s3: VFS: ceph_snapshots: Fix ceph_snap_gmt_readlinkat() to cope with real directory fsps.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit 7933ee403b6c51eb6a2b055ae1064c07ae3d70fd
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 09:26:15 2021 -0800
s3: VFS: ceph: Fix cephwrap_readlinkat() to cope with real directory fsps.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit 545ba86581e1b981f9353f92de168b332b5ef35d
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 09:21:41 2021 -0800
s3: VFS: cap: Fix cap_readlinkat() to cope with real directory fsps.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
commit ca6cad5f00b151702756498d2f79fd059ab75655
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 11 10:52:47 2021 -0800
s3: VFS: expand_msdfs: Since we moved to SMB_VFS_READ_DFS_PATHAT() this module has looked at the wrong function.
Fix it to work as a redirection of SMB_VFS_READ_DFS_PATHAT()
instead of SMB_VFS_READLINKAT().
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Noel Power <noel.power at suse.com>
-----------------------------------------------------------------------
Summary of changes:
source3/modules/The_New_VFS.org | 2 +-
source3/modules/The_New_VFS.txt | 2 +-
source3/modules/vfs_cap.c | 18 +++++-
source3/modules/vfs_ceph.c | 16 ++++--
source3/modules/vfs_ceph_snapshots.c | 40 ++++++++-----
source3/modules/vfs_expand_msdfs.c | 105 ++++++++++++++++++++++-------------
source3/modules/vfs_full_audit.c | 12 +++-
source3/modules/vfs_glusterfs.c | 16 +++++-
source3/modules/vfs_media_harmony.c | 16 +++++-
source3/modules/vfs_shadow_copy2.c | 27 +++++++--
source3/modules/vfs_snapper.c | 36 +++++++-----
source3/modules/vfs_time_audit.c | 12 +++-
source3/modules/vfs_unityed_media.c | 16 +++++-
source3/smbd/trans2.c | 103 +++++++++++++++++++++++-----------
14 files changed, 299 insertions(+), 122 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/modules/The_New_VFS.org b/source3/modules/The_New_VFS.org
index e6e9b155f95..1b7a36c63d5 100644
--- a/source3/modules/The_New_VFS.org
+++ b/source3/modules/The_New_VFS.org
@@ -273,7 +273,7 @@ whenever VFS access is done in a piecemeal fashion.
| SMB_VFS_READ_DFS_PATHAT() | [[Symlink][Symlink]] | Todo |
| SMB_VFS_READDIR() | [[fsp][fsp]] | - |
| SMB_VFS_READDIR_ATTR() | [[Path][Path]] | Todo |
-| SMB_VFS_READLINKAT() | [[Symlink][Symlink]] | Todo |
+| SMB_VFS_READLINKAT() | [[Symlink][Symlink]] | - |
| SMB_VFS_REALPATH() | [[P2px][P2px]] | - |
| SMB_VFS_RECVFILE() | [[fsp][fsp]] | - |
| SMB_VFS_REMOVEXATTR() | [[Path][Path]] | Todo |
diff --git a/source3/modules/The_New_VFS.txt b/source3/modules/The_New_VFS.txt
index f0a84731810..59df7a97a8e 100644
--- a/source3/modules/The_New_VFS.txt
+++ b/source3/modules/The_New_VFS.txt
@@ -341,7 +341,7 @@ Table of Contents
SMB_VFS_READ_DFS_PATHAT() [Symlink] Todo
SMB_VFS_READDIR() [fsp] -
SMB_VFS_READDIR_ATTR() [Path] Todo
- SMB_VFS_READLINKAT() [Symlink] Todo
+ SMB_VFS_READLINKAT() [Symlink] -
SMB_VFS_REALPATH() [P2px] -
SMB_VFS_RECVFILE() [fsp] -
SMB_VFS_REMOVEXATTR() [Path] Todo
diff --git a/source3/modules/vfs_cap.c b/source3/modules/vfs_cap.c
index 0975742598c..95b6087d41c 100644
--- a/source3/modules/vfs_cap.c
+++ b/source3/modules/vfs_cap.c
@@ -553,12 +553,22 @@ static int cap_readlinkat(vfs_handle_struct *handle,
char *buf,
size_t bufsiz)
{
- char *cappath = capencode(talloc_tos(), smb_fname->base_name);
+ struct smb_filename *full_fname = NULL;
struct smb_filename *cap_smb_fname = NULL;
+ char *cappath = NULL;
int saved_errno = 0;
int ret;
- if (!cappath) {
+ full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+ dirfsp,
+ smb_fname);
+ if (full_fname == NULL) {
+ return -1;
+ }
+
+ cappath = capencode(talloc_tos(), full_fname->base_name);
+ if (cappath == NULL) {
+ TALLOC_FREE(full_fname);
errno = ENOMEM;
return -1;
}
@@ -569,18 +579,20 @@ static int cap_readlinkat(vfs_handle_struct *handle,
smb_fname->twrp,
smb_fname->flags);
if (cap_smb_fname == NULL) {
+ TALLOC_FREE(full_fname);
TALLOC_FREE(cappath);
errno = ENOMEM;
return -1;
}
ret = SMB_VFS_NEXT_READLINKAT(handle,
- dirfsp,
+ handle->conn->cwd_fsp,
cap_smb_fname,
buf,
bufsiz);
if (ret == -1) {
saved_errno = errno;
}
+ TALLOC_FREE(full_fname);
TALLOC_FREE(cappath);
TALLOC_FREE(cap_smb_fname);
if (saved_errno != 0) {
diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index 9da074a31ce..47b5046cfcb 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -1090,13 +1090,21 @@ static int cephwrap_readlinkat(struct vfs_handle_struct *handle,
char *buf,
size_t bufsiz)
{
+ struct smb_filename *full_fname = NULL;
int result = -1;
- DBG_DEBUG("[CEPH] readlink(%p, %s, %p, %llu)\n", handle,
- smb_fname->base_name, buf, llu(bufsiz));
- SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
+ full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+ dirfsp,
+ smb_fname);
+ if (full_fname == NULL) {
+ return -1;
+ }
- result = ceph_readlink(handle->data, smb_fname->base_name, buf, bufsiz);
+ DBG_DEBUG("[CEPH] readlink(%p, %s, %p, %llu)\n", handle,
+ full_fname->base_name, buf, llu(bufsiz));
+
+ result = ceph_readlink(handle->data, full_fname->base_name, buf, bufsiz);
+ TALLOC_FREE(full_fname);
DBG_DEBUG("[CEPH] readlink(...) = %d\n", result);
WRAP_RETURN(result);
}
diff --git a/source3/modules/vfs_ceph_snapshots.c b/source3/modules/vfs_ceph_snapshots.c
index 80dfb48c201..1c395e2a020 100644
--- a/source3/modules/vfs_ceph_snapshots.c
+++ b/source3/modules/vfs_ceph_snapshots.c
@@ -1029,15 +1029,19 @@ static int ceph_snap_gmt_readlinkat(vfs_handle_struct *handle,
size_t bufsiz)
{
time_t timestamp = 0;
- char stripped[PATH_MAX + 1];
char conv[PATH_MAX + 1];
int ret;
- struct smb_filename *new_fname;
+ struct smb_filename *full_fname = NULL;
int saved_errno;
+ /*
+ * Now this function only looks at csmb_fname->twrp
+ * we don't need to copy out the path. Just use
+ * csmb_fname->base_name directly.
+ */
ret = ceph_snap_gmt_strip_snapshot(handle,
csmb_fname,
- ×tamp, stripped, sizeof(stripped));
+ ×tamp, NULL, 0);
if (ret < 0) {
errno = -ret;
return -1;
@@ -1049,26 +1053,34 @@ static int ceph_snap_gmt_readlinkat(vfs_handle_struct *handle,
buf,
bufsiz);
}
- ret = ceph_snap_gmt_convert(handle, stripped,
- timestamp, conv, sizeof(conv));
- if (ret < 0) {
- errno = -ret;
+
+ full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+ dirfsp,
+ csmb_fname);
+ if (full_fname == NULL) {
return -1;
}
- new_fname = cp_smb_filename(talloc_tos(), csmb_fname);
- if (new_fname == NULL) {
- errno = ENOMEM;
+
+ /* Find the snapshot path from the full pathname. */
+ ret = ceph_snap_gmt_convert(handle,
+ full_fname->base_name,
+ timestamp,
+ conv,
+ sizeof(conv));
+ if (ret < 0) {
+ TALLOC_FREE(full_fname);
+ errno = -ret;
return -1;
}
- new_fname->base_name = conv;
+ full_fname->base_name = conv;
ret = SMB_VFS_NEXT_READLINKAT(handle,
- dirfsp,
- new_fname,
+ handle->conn->cwd_fsp,
+ full_fname,
buf,
bufsiz);
saved_errno = errno;
- TALLOC_FREE(new_fname);
+ TALLOC_FREE(full_fname);
errno = saved_errno;
return ret;
}
diff --git a/source3/modules/vfs_expand_msdfs.c b/source3/modules/vfs_expand_msdfs.c
index 7deeb2b7374..34e7051dca5 100644
--- a/source3/modules/vfs_expand_msdfs.c
+++ b/source3/modules/vfs_expand_msdfs.c
@@ -24,6 +24,7 @@
#include "smbd/globals.h"
#include "auth.h"
#include "../lib/tsocket/tsocket.h"
+#include "msdfs.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_VFS
@@ -141,6 +142,12 @@ static char *expand_msdfs_target(TALLOC_CTX *ctx,
}
mapfilename[filename_len] = '\0';
+ /*
+ * dfs links returned have had '/' characters replaced with '\'.
+ * Return them to '/' so we can have absoute path mapfilenames.
+ */
+ string_replace(mapfilename, '\\', '/');
+
DEBUG(10, ("Expanding from table [%s]\n", mapfilename));
raddr = tsocket_address_inet_addr_string(conn->sconn->remote_address,
@@ -182,56 +189,76 @@ static char *expand_msdfs_target(TALLOC_CTX *ctx,
return new_target;
}
-static int expand_msdfs_readlinkat(struct vfs_handle_struct *handle,
- const struct files_struct *dirfsp,
- const struct smb_filename *smb_fname,
- char *buf,
- size_t bufsiz)
+static NTSTATUS expand_read_dfs_pathat(struct vfs_handle_struct *handle,
+ TALLOC_CTX *mem_ctx,
+ struct files_struct *dirfsp,
+ struct smb_filename *smb_fname,
+ struct referral **ppreflist,
+ size_t *preferral_count)
{
- TALLOC_CTX *ctx = talloc_tos();
- int result;
- char *target = talloc_array(ctx, char, PATH_MAX+1);
- size_t len;
-
- if (!target) {
- errno = ENOMEM;
- return -1;
- }
- if (bufsiz == 0) {
- errno = EINVAL;
- return -1;
- }
-
- result = SMB_VFS_NEXT_READLINKAT(handle,
+ NTSTATUS status;
+ size_t i;
+ struct referral *reflist = NULL;
+ size_t count = 0;
+ TALLOC_CTX *frame = talloc_stackframe();
+
+ /*
+ * Always call the NEXT function first, then
+ * modify the return if needed.
+ */
+ status = SMB_VFS_NEXT_READ_DFS_PATHAT(handle,
+ mem_ctx,
dirfsp,
smb_fname,
- target,
- PATH_MAX);
+ ppreflist,
+ preferral_count);
- if (result <= 0)
- return result;
+ if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(frame);
+ return status;
+ }
- target[result] = '\0';
+ /*
+ * This function can be called to check if a pathname
+ * is an MSDFS link, but not return the values of it.
+ * In this case ppreflist and preferral_count are NULL,
+ * so don't bother trying to look at any returns.
+ */
+ if (ppreflist == NULL || preferral_count == NULL) {
+ TALLOC_FREE(frame);
+ return status;
+ }
- if ((strncmp(target, "msdfs:", 6) == 0) &&
- (strchr_m(target, '@') != NULL)) {
- target = expand_msdfs_target(ctx, handle->conn, target);
- if (!target) {
- errno = ENOENT;
- return -1;
+ /*
+ * We are always returning the values returned
+ * returned by the NEXT call, but we might mess
+ * with the reflist[i].alternate_path values,
+ * so use local pointers to minimise indirections.
+ */
+ count = *preferral_count;
+ reflist = *ppreflist;
+
+ for (i = 0; i < count; i++) {
+ if (strchr_m(reflist[i].alternate_path, '@') != NULL) {
+ char *new_altpath = expand_msdfs_target(frame,
+ handle->conn,
+ reflist[i].alternate_path);
+ if (new_altpath == NULL) {
+ TALLOC_FREE(*ppreflist);
+ *preferral_count = 0;
+ TALLOC_FREE(frame);
+ return NT_STATUS_NO_MEMORY;
+ }
+ reflist[i].alternate_path = talloc_move(reflist,
+ &new_altpath);
}
}
-
- len = MIN(bufsiz, strlen(target));
-
- memcpy(buf, target, len);
-
- TALLOC_FREE(target);
- return len;
+ TALLOC_FREE(frame);
+ return status;
}
static struct vfs_fn_pointers vfs_expand_msdfs_fns = {
- .readlinkat_fn = expand_msdfs_readlinkat
+ .read_dfs_pathat_fn = expand_read_dfs_pathat,
};
static_decl_vfs;
diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c
index 7d47871680d..cfb9ba4fcef 100644
--- a/source3/modules/vfs_full_audit.c
+++ b/source3/modules/vfs_full_audit.c
@@ -1846,8 +1846,16 @@ static int smb_full_audit_readlinkat(vfs_handle_struct *handle,
char *buf,
size_t bufsiz)
{
+ struct smb_filename *full_fname = NULL;
int result;
+ full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+ dirfsp,
+ smb_fname);
+ if (full_fname == NULL) {
+ return -1;
+ }
+
result = SMB_VFS_NEXT_READLINKAT(handle,
dirfsp,
smb_fname,
@@ -1858,7 +1866,9 @@ static int smb_full_audit_readlinkat(vfs_handle_struct *handle,
(result >= 0),
handle,
"%s",
- smb_fname_str_do_log(handle->conn, smb_fname));
+ smb_fname_str_do_log(handle->conn, full_fname));
+
+ TALLOC_FREE(full_fname);
return result;
}
diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c
index b1fd2a7f098..af0ce70e1e8 100644
--- a/source3/modules/vfs_glusterfs.c
+++ b/source3/modules/vfs_glusterfs.c
@@ -1876,11 +1876,23 @@ static int vfs_gluster_readlinkat(struct vfs_handle_struct *handle,
char *buf,
size_t bufsiz)
{
+ struct smb_filename *full_fname = NULL;
int ret;
START_PROFILE(syscall_readlinkat);
- SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
- ret = glfs_readlink(handle->data, smb_fname->base_name, buf, bufsiz);
+
+ full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+ dirfsp,
+ smb_fname);
+ if (full_fname == NULL) {
+ END_PROFILE(syscall_readlinkat);
+ return -1;
+ }
+
+ ret = glfs_readlink(handle->data, full_fname->base_name, buf, bufsiz);
+
+ TALLOC_FREE(full_fname);
+
END_PROFILE(syscall_readlinkat);
return ret;
diff --git a/source3/modules/vfs_media_harmony.c b/source3/modules/vfs_media_harmony.c
index fb5a082c98e..1df23169472 100644
--- a/source3/modules/vfs_media_harmony.c
+++ b/source3/modules/vfs_media_harmony.c
@@ -1679,10 +1679,19 @@ static int mh_readlinkat(vfs_handle_struct *handle,
size_t bufsiz)
{
int status;
+ struct smb_filename *full_fname = NULL;
struct smb_filename *clientFname = NULL;
DEBUG(MH_INFO_DEBUG, ("Entering mh_readlinkat\n"));
- if (!is_in_media_files(smb_fname->base_name)) {
+ full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+ dirfsp,
+ smb_fname);
+ if (full_fname == NULL) {
+ status = -1;
+ goto err;
+ }
+
+ if (!is_in_media_files(full_fname->base_name)) {
status = SMB_VFS_NEXT_READLINKAT(handle,
dirfsp,
smb_fname,
@@ -1692,13 +1701,13 @@ static int mh_readlinkat(vfs_handle_struct *handle,
}
if ((status = alloc_get_client_smb_fname(handle, talloc_tos(),
- smb_fname,
+ full_fname,
&clientFname))) {
goto err;
}
status = SMB_VFS_NEXT_READLINKAT(handle,
- dirfsp,
+ handle->conn->cwd_fsp,
clientFname,
buf,
bufsiz);
@@ -1706,6 +1715,7 @@ static int mh_readlinkat(vfs_handle_struct *handle,
err:
TALLOC_FREE(clientFname);
out:
+ TALLOC_FREE(full_fname);
return status;
}
diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c
index 227ac148260..76d09587007 100644
--- a/source3/modules/vfs_shadow_copy2.c
+++ b/source3/modules/vfs_shadow_copy2.c
@@ -1578,26 +1578,43 @@ static int shadow_copy2_readlinkat(vfs_handle_struct *handle,
char *stripped = NULL;
int saved_errno = 0;
int ret;
+ struct smb_filename *full_fname = NULL;
struct smb_filename *conv = NULL;
- if (!shadow_copy2_strip_snapshot(talloc_tos(), handle,
- smb_fname,
- ×tamp, &stripped)) {
+ full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+ dirfsp,
+ smb_fname);
+ if (full_fname == NULL) {
+ errno = ENOMEM;
return -1;
}
+
+ if (!shadow_copy2_strip_snapshot(talloc_tos(),
+ handle,
+ full_fname,
+ ×tamp,
+ &stripped)) {
+ TALLOC_FREE(full_fname);
+ return -1;
+ }
+
if (timestamp == 0) {
+ TALLOC_FREE(full_fname);
+ TALLOC_FREE(stripped);
return SMB_VFS_NEXT_READLINKAT(handle,
dirfsp,
smb_fname,
buf,
bufsiz);
}
- conv = cp_smb_filename(talloc_tos(), smb_fname);
+ conv = cp_smb_filename(talloc_tos(), full_fname);
if (conv == NULL) {
+ TALLOC_FREE(full_fname);
TALLOC_FREE(stripped);
errno = ENOMEM;
return -1;
}
+ TALLOC_FREE(full_fname);
conv->base_name = shadow_copy2_convert(
conv, handle, stripped, timestamp);
TALLOC_FREE(stripped);
@@ -1605,7 +1622,7 @@ static int shadow_copy2_readlinkat(vfs_handle_struct *handle,
return -1;
}
ret = SMB_VFS_NEXT_READLINKAT(handle,
- dirfsp,
+ handle->conn->cwd_fsp,
conv,
buf,
bufsiz);
diff --git a/source3/modules/vfs_snapper.c b/source3/modules/vfs_snapper.c
index 3663bf2d4a3..d97e38f6216 100644
--- a/source3/modules/vfs_snapper.c
+++ b/source3/modules/vfs_snapper.c
@@ -2243,14 +2243,18 @@ static int snapper_gmt_readlinkat(vfs_handle_struct *handle,
size_t bufsiz)
{
--
Samba Shared Repository
More information about the samba-cvs
mailing list