r17293: After the results from the cluster tests in Germany,
authorJeremy Allison <jra@samba.org>
Fri, 28 Jul 2006 22:42:39 +0000 (22:42 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:38:24 +0000 (11:38 -0500)
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.
(This used to be commit 4ace291278d9a44f5c577bdd3b282c1231e543df)

source3/lib/messages.c
source3/lib/tallocmsg.c
source3/lib/util_sec.c
source3/locking/brlock.c
source3/locking/locking.c
source3/printing/printing.c
source3/rpc_server/srv_srvsvc_nt.c
source3/smbd/blocking.c
source3/smbd/close.c
source3/smbd/open.c
source3/smbd/oplock.c

index 57e4514b588b7a8896452584f8a2bc70f1da69cf..bae405296459bd9991ce3c18241380b5e06d97ad 100644 (file)
@@ -117,7 +117,10 @@ static void ping_message(int msg_type, struct process_id src,
 
 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, 
@@ -164,6 +167,10 @@ static TDB_DATA message_key_pid(struct process_id pid)
 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 @@ static BOOL message_notify(struct process_id procid)
 
        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;
 }
 
index b515093cd6971ab07cc4f4e81d4941122573be3a..e4364f1ff72c7adafe8614dacfa822ea5cda370a 100644 (file)
@@ -44,10 +44,8 @@ void msg_pool_usage(int msg_type, struct process_id src_pid,
                return;
        }
        
-       become_root();
        message_send_pid(src_pid, MSG_POOL_USAGE,
                         reply, strlen(reply)+1, True);
-       unbecome_root();
 
        SAFE_FREE(reply);
 }
index 26be27ea515b60d06ac689986cc32d4d8572b2da..c13b20ec927fe28d437afa5ebae9aec4de3cf75a 100644 (file)
@@ -52,10 +52,16 @@ static gid_t initial_gid;
 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;
+       }
 }
 
 /****************************************************************************
index 031836ecdfaad225d05bfa1bdf968d681e5976ef..4a36d938addb06d496fbd51c5c04ee3404ed51ca 100644 (file)
@@ -816,11 +816,9 @@ static BOOL brl_unlock_windows(struct byte_range_lock *br_lck, const struct lock
                        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 @@ static BOOL brl_unlock_posix(struct byte_range_lock *br_lck, const struct lock_s
                        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 @@ void brl_close_fnum(struct byte_range_lock *br_lck)
 
                                /* 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();
                                }
                        }
 
index 3cbf318007a2c7102970ac651704406f5b9f555d..3879d40cbab78a50bf5ca5198d4f26c30164a611 100644 (file)
@@ -851,10 +851,8 @@ BOOL rename_share_filename(struct share_mode_lock *lck,
                        (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;
index bb756c8870734ee3d54665a776f5b2f6d11f8f67..fbb81665650c27da3ccba6c1be9bea514bec8661 100644 (file)
@@ -1535,10 +1535,8 @@ static void print_queue_update(int snum, BOOL force)
 
        /* 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 );
 
index e4e5bde21571dd34938c9c6b60ce71f2fd714ec8..de3148aae8910fd357337a2068eff1c30489a378 100644 (file)
@@ -1303,7 +1303,6 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES
        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 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES
                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();
                }
        }
 
index a0b93f5032034fd2fb6f57058c44c3ef524e0402..ed57c9f62162bd1f2a727c78ef5650027a43beb7 100644 (file)
@@ -837,9 +837,6 @@ BOOL blocking_lock_cancel(files_struct *fsp,
        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);
index 08e4a24a56288a2bd366a89b1bcf3cf12f13e4f5..a3ddcae11d004645c351efc05ba46136a359af45 100644 (file)
@@ -134,10 +134,8 @@ static void notify_deferred_opens(struct share_mode_lock *lck)
 
                        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();
                }
        }
 }
index ef59da644732a3ed86c89f3cd2d37df76760a649..5c10c59054915678db560e02aef2cec5fb3b37dc 100644 (file)
@@ -713,10 +713,8 @@ static BOOL delay_for_oplocks(struct share_mode_lock *lck,
                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"));
        }
index 99ce79296fdba145902a8135f7d5321fec2a4265..d9850ee051c9ebeac3133fb16707b75ad73546b2 100644 (file)
@@ -504,13 +504,10 @@ static void process_oplock_break_message(int msg_type, struct process_id src,
                 * 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 @@ static void process_oplock_break_message(int msg_type, struct process_id src,
                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 @@ void reply_to_oplock_break_requests(files_struct *fsp)
 {
        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 @@ void reply_to_oplock_break_requests(files_struct *fsp)
                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 @@ void release_level_2_oplocks_on_change(files_struct *fsp)
 
                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