summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/smbd/dir.c2
-rw-r--r--source3/smbd/proto.h2
-rw-r--r--source3/smbd/reply.c12
3 files changed, 14 insertions, 2 deletions
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 2ab37680b58..ad572947edd 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -1963,7 +1963,7 @@ static int have_file_open_below_fn(struct file_id fid,
return 1;
}
-static bool have_file_open_below(connection_struct *conn,
+bool have_file_open_below(connection_struct *conn,
const struct smb_filename *name)
{
struct have_file_open_below_state state = {
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index be51182628e..55e828649b7 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -232,6 +232,8 @@ long TellDir(struct smb_Dir *dirp);
bool SearchDir(struct smb_Dir *dirp, const char *name, long *poffset);
NTSTATUS can_delete_directory(struct connection_struct *conn,
const char *dirname);
+bool have_file_open_below(connection_struct *conn,
+ const struct smb_filename *name);
/* The following definitions come from smbd/dmapi.c */
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index c43713555bf..efef6138d9b 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -2676,7 +2676,17 @@ static NTSTATUS can_rename(connection_struct *conn, files_struct *fsp,
/* If no pathnames are open below this
directory, allow the rename. */
- if (file_find_subpath(fsp)) {
+ if (lp_strict_rename(SNUM(conn))) {
+ /*
+ * Strict rename, check open file db.
+ */
+ if (have_file_open_below(fsp->conn, fsp->fsp_name)) {
+ return NT_STATUS_ACCESS_DENIED;
+ }
+ } else if (file_find_subpath(fsp)) {
+ /*
+ * No strict rename, just look in local process.
+ */
return NT_STATUS_ACCESS_DENIED;
}
return NT_STATUS_OK;