summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib')
-rw-r--r--source3/lib/messages.c28
-rw-r--r--source3/lib/tallocmsg.c2
-rw-r--r--source3/lib/util_sec.c10
3 files changed, 32 insertions, 8 deletions
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 57e4514b58..bae4052964 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -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;
}
diff --git a/source3/lib/tallocmsg.c b/source3/lib/tallocmsg.c
index b515093cd6..e4364f1ff7 100644
--- a/source3/lib/tallocmsg.c
+++ b/source3/lib/tallocmsg.c
@@ -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);
}
diff --git a/source3/lib/util_sec.c b/source3/lib/util_sec.c
index 26be27ea51..c13b20ec92 100644
--- a/source3/lib/util_sec.c
+++ b/source3/lib/util_sec.c
@@ -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;
+ }
}
/****************************************************************************