svn commit: samba r17293 - in branches/SAMBA_3_0/source: lib locking printing rpc_server smbd

jra at samba.org jra at samba.org
Fri Jul 28 22:42:41 GMT 2006


Author: jra
Date: 2006-07-28 22:42:39 +0000 (Fri, 28 Jul 2006)
New Revision: 17293

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17293

Log:
After the results from the cluster tests in Germany,
fix the messaging code to call the efficient calls :

save_re_uid()
set_effective_uid(0);

messaging_op

restore_re_uid();

instead of using heavyweight become_root()/unbecome_root()
pairs around all messaging code. Fixup the messaging
code to ensure sec_init() is called (only once) so that non-root
processes still work when sending messages.

This is a lighter weight solution to become_root()/unbecome_root()
(which swaps all the supplemental groups) and should be more
efficient. I will migrate all server code over to using this
(a similar technique should be used in the passdb backend
where needed).

Jeremy.


Modified:
   branches/SAMBA_3_0/source/lib/messages.c
   branches/SAMBA_3_0/source/lib/tallocmsg.c
   branches/SAMBA_3_0/source/lib/util_sec.c
   branches/SAMBA_3_0/source/locking/brlock.c
   branches/SAMBA_3_0/source/locking/locking.c
   branches/SAMBA_3_0/source/printing/printing.c
   branches/SAMBA_3_0/source/rpc_server/srv_srvsvc_nt.c
   branches/SAMBA_3_0/source/smbd/blocking.c
   branches/SAMBA_3_0/source/smbd/close.c
   branches/SAMBA_3_0/source/smbd/open.c
   branches/SAMBA_3_0/source/smbd/oplock.c


Changeset:
Modified: branches/SAMBA_3_0/source/lib/messages.c
===================================================================
--- branches/SAMBA_3_0/source/lib/messages.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/lib/messages.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -117,8 +117,11 @@
 
 BOOL message_init(void)
 {
-	if (tdb) return True;
+	sec_init();
 
+	if (tdb)
+		return True;
+
 	tdb = tdb_open_log(lock_path("messages.tdb"), 
 		       0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, 
 		       O_RDWR|O_CREAT,0600);
@@ -164,6 +167,10 @@
 static BOOL message_notify(struct process_id procid)
 {
 	pid_t pid = procid.pid;
+	int saved_errno;
+	int ret;
+	uid_t euid = geteuid();
+
 	/*
 	 * Doing kill with a non-positive pid causes messages to be
 	 * sent to places we don't want.
@@ -171,15 +178,28 @@
 
 	SMB_ASSERT(pid > 0);
 
-	if (kill(pid, SIGUSR1) == -1) {
-		if (errno == ESRCH) {
+	if (euid != 0) {
+	        save_re_uid();
+		set_effective_uid(0);
+	}
+
+	ret = kill(pid, SIGUSR1);
+	saved_errno = errno;
+
+	if (euid != 0) {
+		restore_re_uid();
+	}
+
+	if (ret == -1) {
+		if (saved_errno == ESRCH) {
 			DEBUG(2,("pid %d doesn't exist - deleting messages record\n", (int)pid));
 			tdb_delete(tdb, message_key_pid(procid));
 		} else {
-			DEBUG(2,("message to process %d failed - %s\n", (int)pid, strerror(errno)));
+			DEBUG(2,("message to process %d failed - %s\n", (int)pid, strerror(saved_errno)));
 		}
 		return False;
 	}
+
 	return True;
 }
 

Modified: branches/SAMBA_3_0/source/lib/tallocmsg.c
===================================================================
--- branches/SAMBA_3_0/source/lib/tallocmsg.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/lib/tallocmsg.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -44,10 +44,8 @@
 		return;
 	}
 	
-	become_root();
 	message_send_pid(src_pid, MSG_POOL_USAGE,
 			 reply, strlen(reply)+1, True);
-	unbecome_root();
 
 	SAFE_FREE(reply);
 }

Modified: branches/SAMBA_3_0/source/lib/util_sec.c
===================================================================
--- branches/SAMBA_3_0/source/lib/util_sec.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/lib/util_sec.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -52,10 +52,16 @@
 remember what uid we got started as - this allows us to run correctly
 as non-root while catching trapdoor systems
 ****************************************************************************/
+
 void sec_init(void)
 {
-	initial_uid = geteuid();
-	initial_gid = getegid();
+	static int initialized;
+
+	if (!initialized) {
+		initial_uid = geteuid();
+		initial_gid = getegid();
+		initialized = 1;
+	}
 }
 
 /****************************************************************************

Modified: branches/SAMBA_3_0/source/locking/brlock.c
===================================================================
--- branches/SAMBA_3_0/source/locking/brlock.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/locking/brlock.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -816,11 +816,9 @@
 			DEBUG(10,("brl_unlock: sending unlock message to pid %s\n",
 				procid_str_static(&pend_lock->context.pid )));
 
-			become_root();
 			message_send_pid(pend_lock->context.pid,
 					MSG_SMB_UNLOCK,
 					NULL, 0, True);
-			unbecome_root();
 		}
 	}
 
@@ -985,11 +983,9 @@
 			DEBUG(10,("brl_unlock: sending unlock message to pid %s\n",
 				procid_str_static(&pend_lock->context.pid )));
 
-			become_root();
 			message_send_pid(pend_lock->context.pid,
 					MSG_SMB_UNLOCK,
 					NULL, 0, True);
-			unbecome_root();
 		}
 	}
 
@@ -1306,11 +1302,9 @@
 
 				/* We could send specific lock info here... */
 				if (brl_pending_overlap(lock, pend_lock)) {
-					become_root();
 					message_send_pid(pend_lock->context.pid,
 							MSG_SMB_UNLOCK,
 							NULL, 0, True);
-					unbecome_root();
 				}
 			}
 

Modified: branches/SAMBA_3_0/source/locking/locking.c
===================================================================
--- branches/SAMBA_3_0/source/locking/locking.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/locking/locking.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -851,10 +851,8 @@
 			(unsigned int)lck->dev, (double)lck->ino,
 			lck->servicepath, lck->filename ));
 
-		become_root();
 		message_send_pid(se->pid, MSG_SMB_FILE_RENAME,
 				frm, msg_len, True);
-		unbecome_root();
 	}
 
 	return True;

Modified: branches/SAMBA_3_0/source/printing/printing.c
===================================================================
--- branches/SAMBA_3_0/source/printing/printing.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/printing/printing.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -1535,10 +1535,8 @@
 
 	/* finally send the message */
 	
-	become_root();
 	message_send_pid(pid_to_procid(background_lpq_updater_pid),
 		 MSG_PRINTER_UPDATE, buffer, len, False);
-	unbecome_root();
 
 	SAFE_FREE( buffer );
 

Modified: branches/SAMBA_3_0/source/rpc_server/srv_srvsvc_nt.c
===================================================================
--- branches/SAMBA_3_0/source/rpc_server/srv_srvsvc_nt.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/rpc_server/srv_srvsvc_nt.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -1303,7 +1303,6 @@
 	int num_sessions, snum;
 	fstring username;
 	fstring machine;
-	BOOL not_root = False;
 
 	rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name);
 	rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name);
@@ -1332,16 +1331,8 @@
 		if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) &&
 		    strequal(session_list[snum].remote_machine, machine)) {
 		
-			if (p->pipe_user.ut.uid != sec_initial_uid()) {
-				not_root = True;
-				become_root();
-			}
-
 			if (message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False))
 				r_u->status = WERR_OK;
-
-			if (not_root) 
-				unbecome_root();
 		}
 	}
 

Modified: branches/SAMBA_3_0/source/smbd/blocking.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/blocking.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/smbd/blocking.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -837,9 +837,6 @@
 	memcpy(msg, &blr, sizeof(blr));
 	memcpy(&msg[sizeof(blr)], &err, sizeof(NTSTATUS));
 
-	/* Don't need to be root here as we're only ever
-		sending to ourselves. */
-
 	message_send_pid(pid_to_procid(sys_getpid()),
 			MSG_SMB_BLOCKING_LOCK_CANCEL,
 			&msg, sizeof(msg), True);

Modified: branches/SAMBA_3_0/source/smbd/close.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/close.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/smbd/close.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -134,10 +134,8 @@
 
 			share_mode_entry_to_message(msg, e);
 
-			become_root();
  			message_send_pid(e->pid, MSG_SMB_OPEN_RETRY,
  					 msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
-			unbecome_root();
  		}
  	}
 }

Modified: branches/SAMBA_3_0/source/smbd/open.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/open.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/smbd/open.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -713,10 +713,8 @@
 		SSVAL(msg,6,exclusive->op_type | FORCE_OPLOCK_BREAK_TO_NONE);
 	}
 
-	become_root();
 	ret = message_send_pid(exclusive->pid, MSG_SMB_BREAK_REQUEST,
 			       msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
-	unbecome_root();
 	if (!ret) {
 		DEBUG(3, ("Could not send oplock break message\n"));
 	}

Modified: branches/SAMBA_3_0/source/smbd/oplock.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/oplock.c	2006-07-28 21:23:53 UTC (rev 17292)
+++ branches/SAMBA_3_0/source/smbd/oplock.c	2006-07-28 22:42:39 UTC (rev 17293)
@@ -504,13 +504,10 @@
 		 * get to process this message, we have closed the file. Reply
 		 * with 'ok, oplock broken' */
 		DEBUG(3, ("Did not find fsp\n"));
-		become_root();
 
 		/* We just send the same message back. */
 		message_send_pid(src, MSG_SMB_BREAK_RESPONSE,
 				 buf, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
-
-		unbecome_root();
 		return;
 	}
 
@@ -529,13 +526,9 @@
 		DEBUG(3, ("Already downgraded oplock on 0x%x/%.0f: %s\n",
 			  (unsigned int)fsp->dev, (double)fsp->inode,
 			  fsp->fsp_name));
-		become_root();
-
 		/* We just send the same message back. */
 		message_send_pid(src, MSG_SMB_BREAK_RESPONSE,
 				 buf, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
-
-		unbecome_root();
 		return;
 	}
 
@@ -656,7 +649,6 @@
 {
 	int i;
 
-	become_root();
 	for (i=0; i<fsp->num_pending_break_messages; i++) {
 		struct share_mode_entry *e = &fsp->pending_break_messages[i];
 		char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
@@ -666,7 +658,6 @@
 		message_send_pid(e->pid, MSG_SMB_BREAK_RESPONSE,
 				 msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
 	}
-	unbecome_root();
 
 	SAFE_FREE(fsp->pending_break_messages);
 	fsp->num_pending_break_messages = 0;
@@ -801,10 +792,8 @@
 
 		share_mode_entry_to_message(msg, share_entry);
 
-		become_root();
 		message_send_pid(share_entry->pid, MSG_SMB_ASYNC_LEVEL2_BREAK,
 				 msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
-		unbecome_root();
 	}
 
 	/* We let the message receivers handle removing the oplock state



More information about the samba-cvs mailing list