[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-unstable-1266-g767e016

Jeremy Allison jra at samba.org
Fri Jan 11 00:40:53 GMT 2008


The branch, v3-2-test has been updated
       via  767e0164adf8803df50b0b7bd8e81d25af72bb78 (commit)
       via  3caeeaea162e2083a087c242b850c107a3be1bf9 (commit)
      from  3958abffaf2866c69ad9e13ec345364fde5c78bb (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit 767e0164adf8803df50b0b7bd8e81d25af72bb78
Merge: 3caeeaea162e2083a087c242b850c107a3be1bf9 3958abffaf2866c69ad9e13ec345364fde5c78bb
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Jan 10 16:36:05 2008 -0800

    Merge branch 'v3-2-test' of ssh://jra@git.samba.org/data/git/samba into v3-2-test

commit 3caeeaea162e2083a087c242b850c107a3be1bf9
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Jan 10 16:35:54 2008 -0800

    Don't switch user contexts unless you have to. Saves
    a bunch of syscalls on close. Noticed by Volker.
    Jeremy.

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

Summary of changes:
 source/smbd/close.c   |   39 +++++++++++++++++++++++++--------------
 source/smbd/sec_ctx.c |   17 +++++++++++++++++
 2 files changed, 42 insertions(+), 14 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/smbd/close.c b/source/smbd/close.c
index c74e133..f67a4ad 100644
--- a/source/smbd/close.c
+++ b/source/smbd/close.c
@@ -163,7 +163,8 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
 					enum file_close_type close_type)
 {
 	connection_struct *conn = fsp->conn;
-	bool delete_file = False;
+	bool delete_file = false;
+	bool changed_user = false;
 	struct share_mode_lock *lck;
 	SMB_STRUCT_STAT sbuf;
 	NTSTATUS status = NT_STATUS_OK;
@@ -246,18 +247,26 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
 	DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set "
 		 "- deleting file.\n", fsp->fsp_name));
 
-	/* Become the user who requested the delete. */
+	if (!unix_token_equal(lck->delete_token, &current_user.ut)) {
+		/* Become the user who requested the delete. */
 
-	if (!push_sec_ctx()) {
-		smb_panic("close_remove_share_mode: file %s. failed to push "
-			  "sec_ctx.\n");
-	}
+		DEBUG(5,("close_remove_share_mode: file %s. "
+			"Change user to uid %u\n",
+			(unsigned int)lck->delete_token->uid));
 
-	set_sec_ctx(lck->delete_token->uid,
-		    lck->delete_token->gid,
-		    lck->delete_token->ngroups,
-		    lck->delete_token->groups,
-		    NULL);
+		if (!push_sec_ctx()) {
+			smb_panic("close_remove_share_mode: file %s. failed to push "
+				  "sec_ctx.\n");
+		}
+
+		set_sec_ctx(lck->delete_token->uid,
+			    lck->delete_token->gid,
+			    lck->delete_token->ngroups,
+			    lck->delete_token->groups,
+			    NULL);
+
+		changed_user = true;
+	}
 
 	/* We can only delete the file if the name we have is still valid and
 	   hasn't been renamed. */
@@ -326,9 +335,11 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
 
  done:
 
-	/* unbecome user. */
-	pop_sec_ctx();
-	
+	if (changed_user) {
+		/* unbecome user. */
+		pop_sec_ctx();
+	}
+
 	TALLOC_FREE(lck);
 	return status;
 }
diff --git a/source/smbd/sec_ctx.c b/source/smbd/sec_ctx.c
index 6edcc36..0f307f6 100644
--- a/source/smbd/sec_ctx.c
+++ b/source/smbd/sec_ctx.c
@@ -33,6 +33,23 @@ static struct sec_ctx sec_ctx_stack[MAX_SEC_CTX_DEPTH + 1];
 static int sec_ctx_stack_ndx;
 
 /****************************************************************************
+ Are two UNIX tokens equal ?
+****************************************************************************/
+
+bool unix_token_equal(const UNIX_USER_TOKEN *t1, const UNIX_USER_TOKEN *t2)
+{
+	if (t1->uid != t2->uid || t1->gid != t2->gid ||
+			t1->ngroups != t2->ngroups) {
+		return false;
+	}
+	if (memcmp(t1->groups, t2->groups,
+			t1->ngroups*sizeof(gid_t)) != 0) {
+		return false;
+	}
+	return true;
+}
+
+/****************************************************************************
  Become the specified uid.
 ****************************************************************************/
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list