[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Tue Dec 28 18:16:02 MST 2010


The branch, master has been updated
       via  9b31f6ab Fix bug #7892 - open_file_fchmod() leaves a stale lock.
      from  4622812 s3: Make name_query return NTSTATUS

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 9b31f6ab6cce55824f3e62f59061085abc1240db
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Dec 28 16:25:16 2010 -0800

    Fix bug #7892 - open_file_fchmod() leaves a stale lock.
    
    Autobuild-User: Jeremy Allison <jra at samba.org>
    Autobuild-Date: Wed Dec 29 02:15:23 CET 2010 on sn-devel-104

-----------------------------------------------------------------------

Summary of changes:
 source3/include/proto.h   |    3 +--
 source3/smbd/dosmode.c    |   11 ++++-------
 source3/smbd/open.c       |   40 ++++------------------------------------
 source3/smbd/posix_acls.c |    4 ++--
 4 files changed, 11 insertions(+), 47 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index 9b391ae..c469888 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -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,
diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c
index cf95348..838dec0 100644
--- a/source3/smbd/dosmode.c
+++ b/source3/smbd/dosmode.c
@@ -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,
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 32a08b5..722e461 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -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,
diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c
index 54fa5bf..880d5b9 100644
--- a/source3/smbd/posix_acls.c
+++ b/source3/smbd/posix_acls.c
@@ -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;
 }


-- 
Samba Shared Repository


More information about the samba-cvs mailing list