diff options
-rw-r--r-- | source3/smbd/dir.c | 2 | ||||
-rw-r--r-- | source3/smbd/proto.h | 2 | ||||
-rw-r--r-- | source3/smbd/reply.c | 12 |
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; |