summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2017-03-27 17:09:38 -0700
committerKarolin Seeger <kseeger@samba.org>2017-03-29 10:24:14 +0200
commited694d068081d4849e558fabc0c42085c64ee3b5 (patch)
tree18948c9fbab6dec92e5b45b0058de229dc0ec182
parent8e3e969eeddc542385d0ccee793f71c12e8fd4b6 (diff)
downloadsamba-ed694d068081d4849e558fabc0c42085c64ee3b5.tar.gz
s3: smbd: Fix "follow symlink = no" regression part 2.
Use the cwd_name parameter to reconstruct the original client name for symlink testing. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12721 Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org> (cherry picked from commit e182a4d39e86c9694e255efdf6ee2ea3ccb9af4a)
-rw-r--r--source3/smbd/vfs.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
index 22054674435..254337f05b8 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -1162,6 +1162,7 @@ NTSTATUS check_reduced_name(connection_struct *conn,
const char *fname)
{
char *resolved_name = NULL;
+ char *new_fname = NULL;
bool allow_symlinks = true;
bool allow_widelinks = false;
@@ -1303,11 +1304,32 @@ NTSTATUS check_reduced_name(connection_struct *conn,
}
p++;
+
+ /*
+ * If cwd_name is present and not ".",
+ * then fname is relative to that, not
+ * the root of the share. Make sure the
+ * path we check is the one the client
+ * sent (cwd_name+fname).
+ */
+ if (cwd_name != NULL && !ISDOT(cwd_name)) {
+ new_fname = talloc_asprintf(talloc_tos(),
+ "%s/%s",
+ cwd_name,
+ fname);
+ if (new_fname == NULL) {
+ SAFE_FREE(resolved_name);
+ return NT_STATUS_NO_MEMORY;
+ }
+ fname = new_fname;
+ }
+
if (strcmp(fname, p)!=0) {
DEBUG(2, ("check_reduced_name: Bad access "
"attempt: %s is a symlink to %s\n",
fname, p));
SAFE_FREE(resolved_name);
+ TALLOC_FREE(new_fname);
return NT_STATUS_ACCESS_DENIED;
}
}
@@ -1317,6 +1339,7 @@ NTSTATUS check_reduced_name(connection_struct *conn,
DBG_INFO("%s reduced to %s\n", fname, resolved_name);
SAFE_FREE(resolved_name);
+ TALLOC_FREE(new_fname);
return NT_STATUS_OK;
}