diff options
-rw-r--r-- | source3/locking/locking.c | 4 | ||||
-rw-r--r-- | source3/locking/proto.h | 2 | ||||
-rw-r--r-- | source3/smbd/open.c | 19 |
3 files changed, 17 insertions, 8 deletions
diff --git a/source3/locking/locking.c b/source3/locking/locking.c index f584e0cf65..055d0f8245 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -734,12 +734,12 @@ static bool add_share_mode_entry(struct share_mode_data *d, return true; } -void set_share_mode(struct share_mode_lock *lck, files_struct *fsp, +bool set_share_mode(struct share_mode_lock *lck, files_struct *fsp, uid_t uid, uint64_t mid, uint16 op_type) { struct share_mode_entry entry; fill_share_mode_entry(&entry, fsp, uid, mid, op_type); - add_share_mode_entry(lck->data, &entry); + return add_share_mode_entry(lck->data, &entry); } /******************************************************************* diff --git a/source3/locking/proto.h b/source3/locking/proto.h index dde0be431d..02e2bf5307 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -171,7 +171,7 @@ void get_file_infos(struct file_id id, struct timespec *write_time); bool is_valid_share_mode_entry(const struct share_mode_entry *e); bool share_mode_stale_pid(struct share_mode_data *d, uint32_t idx); -void set_share_mode(struct share_mode_lock *lck, files_struct *fsp, +bool set_share_mode(struct share_mode_lock *lck, files_struct *fsp, uid_t uid, uint64_t mid, uint16 op_type); bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp); bool mark_share_mode_disconnected(struct share_mode_lock *lck, diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 858d2befc2..55f2fb2164 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -2681,9 +2681,13 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn, fsp->oplock_type = NO_OPLOCK; } - set_share_mode(lck, fsp, get_current_uid(conn), - req ? req->mid : 0, - fsp->oplock_type); + if (!set_share_mode(lck, fsp, get_current_uid(conn), + req ? req->mid : 0, + fsp->oplock_type)) { + TALLOC_FREE(lck); + fd_close(fsp); + return NT_STATUS_NO_MEMORY; + } /* Handle strange delete on close create semantics. */ if (create_options & FILE_DELETE_ON_CLOSE) { @@ -3173,8 +3177,13 @@ static NTSTATUS open_directory(connection_struct *conn, return status; } - set_share_mode(lck, fsp, get_current_uid(conn), - req ? req->mid : 0, NO_OPLOCK); + if (!set_share_mode(lck, fsp, get_current_uid(conn), + req ? req->mid : 0, NO_OPLOCK)) { + TALLOC_FREE(lck); + fd_close(fsp); + file_free(req, fsp); + return NT_STATUS_NO_MEMORY; + } /* For directories the delete on close bit at open time seems always to be honored on close... See test 19 in Samba4 BASE-DELETE. */ |