1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

Fix bug #7892 - open_file_fchmod() leaves a stale lock.

Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Wed Dec 29 02:15:23 CET 2010 on sn-devel-104
This commit is contained in:
Jeremy Allison 2010-12-28 16:25:16 -08:00
parent 4622812a41
commit 9b31f6ab6c
4 changed files with 11 additions and 47 deletions

View File

@ -5017,10 +5017,9 @@ bool map_open_params_to_ntcreate(const struct smb_filename *smb_fname,
uint32_t *pprivate_flags);
void remove_deferred_open_entry(struct file_id id, uint64_t mid,
struct server_id pid);
NTSTATUS open_file_fchmod(struct smb_request *req, connection_struct *conn,
NTSTATUS open_file_fchmod(connection_struct *conn,
struct smb_filename *smb_fname,
files_struct **result);
NTSTATUS close_file_fchmod(struct smb_request *req, files_struct *fsp);
NTSTATUS create_directory(connection_struct *conn, struct smb_request *req,
struct smb_filename *smb_dname);
void msg_file_was_renamed(struct messaging_context *msg,

View File

@ -415,7 +415,7 @@ static bool set_ea_dos_attribute(connection_struct *conn,
* are not violating security in doing the setxattr.
*/
if (!NT_STATUS_IS_OK(open_file_fchmod(NULL, conn, smb_fname,
if (!NT_STATUS_IS_OK(open_file_fchmod(conn, smb_fname,
&fsp)))
return ret;
become_root();
@ -425,7 +425,7 @@ static bool set_ea_dos_attribute(connection_struct *conn,
ret = true;
}
unbecome_root();
close_file_fchmod(NULL, fsp);
close_file(NULL, fsp, NORMAL_CLOSE);
return ret;
}
DEBUG(10,("set_ea_dos_attribute: set EA 0x%x on file %s\n",
@ -823,18 +823,15 @@ int file_set_dosmode(connection_struct *conn, struct smb_filename *smb_fname,
* We need to open the file with write access whilst
* still in our current user context. This ensures we
* are not violating security in doing the fchmod.
* This file open does *not* break any oplocks we are
* holding. We need to review this.... may need to
* break batch oplocks open by others. JRA.
*/
files_struct *fsp;
if (!NT_STATUS_IS_OK(open_file_fchmod(NULL, conn, smb_fname,
if (!NT_STATUS_IS_OK(open_file_fchmod(conn, smb_fname,
&fsp)))
return -1;
become_root();
ret = SMB_VFS_FCHMOD(fsp, unixmode);
unbecome_root();
close_file_fchmod(NULL, fsp);
close_file(NULL, fsp, NORMAL_CLOSE);
if (!newfile) {
notify_fname(conn, NOTIFY_ACTION_MODIFIED,
FILE_NOTIFY_CHANGE_ATTRIBUTES,

View File

@ -2291,23 +2291,15 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
Open a file for for write to ensure that we can fchmod it.
****************************************************************************/
NTSTATUS open_file_fchmod(struct smb_request *req, connection_struct *conn,
NTSTATUS open_file_fchmod(connection_struct *conn,
struct smb_filename *smb_fname,
files_struct **result)
{
files_struct *fsp = NULL;
NTSTATUS status;
if (!VALID_STAT(smb_fname->st)) {
return NT_STATUS_INVALID_PARAMETER;
}
status = file_new(req, conn, &fsp);
if(!NT_STATUS_IS_OK(status)) {
return status;
}
status = SMB_VFS_CREATE_FILE(
return SMB_VFS_CREATE_FILE(
conn, /* conn */
NULL, /* req */
0, /* root_dir_fid */
@ -2318,37 +2310,13 @@ NTSTATUS open_file_fchmod(struct smb_request *req, connection_struct *conn,
FILE_OPEN, /* create_disposition*/
0, /* create_options */
0, /* file_attributes */
0, /* oplock_request */
INTERNAL_OPEN_ONLY, /* oplock_request */
0, /* allocation_size */
0, /* private_flags */
NULL, /* sd */
NULL, /* ea_list */
&fsp, /* result */
result, /* result */
NULL); /* pinfo */
/*
* This is not a user visible file open.
* Don't set a share mode.
*/
if (!NT_STATUS_IS_OK(status)) {
file_free(req, fsp);
return status;
}
*result = fsp;
return NT_STATUS_OK;
}
/****************************************************************************
Close the fchmod file fd - ensure no locks are lost.
****************************************************************************/
NTSTATUS close_file_fchmod(struct smb_request *req, files_struct *fsp)
{
NTSTATUS status = fd_close(fsp);
file_free(req, fsp);
return status;
}
static NTSTATUS mkdir_internal(connection_struct *conn,

View File

@ -3603,7 +3603,7 @@ int try_chown(connection_struct *conn, struct smb_filename *smb_fname,
return -1;
}
if (!NT_STATUS_IS_OK(open_file_fchmod(NULL, conn, smb_fname, &fsp))) {
if (!NT_STATUS_IS_OK(open_file_fchmod(conn, smb_fname, &fsp))) {
return -1;
}
@ -3622,7 +3622,7 @@ int try_chown(connection_struct *conn, struct smb_filename *smb_fname,
}
unbecome_root();
close_file_fchmod(NULL, fsp);
close_file(NULL, fsp, NORMAL_CLOSE);
return ret;
}