[launchd-changes] [23708] trunk/launchd/src

source_changes at macosforge.org source_changes at macosforge.org
Fri Aug 29 16:23:54 PDT 2008


Revision: 23708
          http://trac.macosforge.org/projects/launchd/changeset/23708
Author:   dsorresso at apple.com
Date:     2008-08-29 16:23:53 -0700 (Fri, 29 Aug 2008)
Log Message:
-----------
Fixes for rdar://problem/6153301 and rdar://problem/5553797.
Minor tweaks to the job_mig_set_service_policy() logging.
Added a kqueue timer for shutdown to log jobs still active.

Modified Paths:
--------------
    trunk/launchd/src/launchd.c
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/launchd_mig_types.defs
    trunk/launchd/src/libbootstrap.c
    trunk/launchd/src/libbootstrap_private.h
    trunk/launchd/src/libbootstrap_public.h

Modified: trunk/launchd/src/launchd.c
===================================================================
--- trunk/launchd/src/launchd.c	2008-08-28 19:39:50 UTC (rev 23707)
+++ trunk/launchd/src/launchd.c	2008-08-29 23:23:53 UTC (rev 23708)
@@ -67,6 +67,7 @@
 #include <setjmp.h>
 #include <spawn.h>
 #include <sched.h>
+#include <pthread.h>
 
 #include "libbootstrap_public.h"
 #include "libvproc_public.h"
@@ -96,9 +97,12 @@
 static void fatal_signal_handler(int sig, siginfo_t *si, void *uap);
 static void handle_pid1_crashes_separately(void);
 
+static void *update_thread(void *nothing);
+
 static bool re_exec_in_single_user_mode;
 static void *crash_addr;
 static pid_t crash_pid;
+static unsigned int g_sync_frequency = 30;
 
 bool shutdown_in_progress;
 bool fake_shutdown_in_progress;
@@ -165,6 +169,13 @@
 		_vproc_transaction_end();
 	}
 
+	if( pid1_magic ) {
+		/* Start the update thread -- rdar://problem/5039559&6153301 */
+		pthread_t t = NULL;
+		int err = pthread_create(&t, NULL, update_thread, NULL);
+		launchd_assumes(err == 0);
+	}
+
 	jobmgr_init(sflag);
 
 	launchd_runtime_init2();
@@ -187,6 +198,16 @@
 	launchd_assumes(sigaction(SIGSEGV, &fsa, NULL) != -1);
 }
 
+void *update_thread(void *nothing __attribute__((unused)))
+{
+	while( g_sync_frequency ) {
+		sync();
+		sleep(g_sync_frequency);
+	}
+	
+	return NULL;
+}
+
 #define PID1_CRASH_LOGFILE "/var/log/launchd-pid1.crash"
 
 /* This hack forces the dynamic linker to resolve these symbols ASAP */

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2008-08-28 19:39:50 UTC (rev 23707)
+++ trunk/launchd/src/launchd_core_logic.c	2008-08-29 23:23:53 UTC (rev 23708)
@@ -855,7 +855,9 @@
 	}
 
 	if (do_apple_internal_logging && jm->parentmgr == NULL && pid1_magic) {
-		runtime_set_timeout(still_alive_with_check, 5);
+		if( pid1_magic ) {
+			jobmgr_assumes(jm, kevent_mod((uintptr_t)jm, EVFILT_TIMER, EV_ADD, NOTE_SECONDS, 5, jm));
+		}
 	}
 
 	return jobmgr_do_garbage_collection(jm);
@@ -2794,7 +2796,7 @@
 		break;
 	case EVFILT_SIGNAL:
 		switch (kev->ident) {
-		case SIGTERM:
+		case SIGTERM:			
 			return launchd_shutdown();
 		case SIGUSR1:
 			return calendarinterval_callback();
@@ -2832,6 +2834,9 @@
 	case EVFILT_TIMER:
 		if (jobmgr_assumes(jm, kev->ident == (uintptr_t)&sorted_calendar_events)) {
 			calendarinterval_callback();
+		} else if( kev->ident == (uintptr_t)jm ) {
+			jobmgr_log(jm, LOG_DEBUG, "Shutdown timer firing.");
+			still_alive_with_check();
 		}
 		break;
 	default:
@@ -7134,8 +7139,18 @@
 		return BOOTSTRAP_NO_MEMORY;
 	}
 
-	if (ldc->euid && (ldc->euid != getuid())) {
-		job_log(j, LOG_ERR, "Denied Mach service policy update against PID %u due to mismatched credentials: UID/EUID %u/%u", target_pid, ldc->uid, ldc->euid);
+	if (ldc->euid && (ldc->euid != getuid())) {		
+		int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, target_pid };
+		struct kinfo_proc kp;
+		size_t len = sizeof(kp);
+
+		job_assumes(j, sysctl(mib, 4, &kp, &len, NULL, 0) != -1);
+
+		uid_t kp_euid = kp.kp_eproc.e_ucred.cr_uid;
+		uid_t kp_uid = kp.kp_eproc.e_pcred.p_ruid;
+
+		job_log(j, LOG_ERR, "Denied Mach service policy update requested by UID/EUID %u/%u against PID %u with UID/EUID %u/%u due to mismatched credentials.", ldc->uid, ldc->euid, target_pid, kp_uid, kp_euid);
+
 		return BOOTSTRAP_NOT_PRIVILEGED;
 	}
 

Modified: trunk/launchd/src/launchd_mig_types.defs
===================================================================
--- trunk/launchd/src/launchd_mig_types.defs	2008-08-28 19:39:50 UTC (rev 23707)
+++ trunk/launchd/src/launchd_mig_types.defs	2008-08-29 23:23:53 UTC (rev 23708)
@@ -23,16 +23,16 @@
  * Copyright, 1990.  All rights reserved.
  */
 
-type pid_t			= integer_t;
-type pid_array_t		= ^array [] of pid_t;
-type uid_t			= integer_t;
-type gid_t			= integer_t;
-type vproc_gsk_t		= integer_t;
-type logmsg_t			= c_string[*:2048];
-type cmd_t			= c_string[512];
-type name_t			= c_string[128];
-type name_array_t		= ^array [] of name_t;
-type bootstrap_status_t		= integer_t;
+type pid_t						= integer_t;
+type pid_array_t				= ^array [] of pid_t;
+type uid_t						= integer_t;
+type gid_t						= integer_t;
+type vproc_gsk_t				= integer_t;
+type logmsg_t					= c_string[*:2048];
+type cmd_t						= c_string[512];
+type name_t						= c_string[128];
+type name_array_t				= ^array [] of name_t;
+type bootstrap_status_t			= integer_t;
 type bootstrap_status_array_t	= ^array [] of bootstrap_status_t;
 
 type job_t = mach_port_t

Modified: trunk/launchd/src/libbootstrap.c
===================================================================
--- trunk/launchd/src/libbootstrap.c	2008-08-28 19:39:50 UTC (rev 23707)
+++ trunk/launchd/src/libbootstrap.c	2008-08-29 23:23:53 UTC (rev 23708)
@@ -127,19 +127,19 @@
 }
 
 kern_return_t
-bootstrap_check_in(mach_port_t bp, name_t service_name, mach_port_t *sp)
+bootstrap_check_in(mach_port_t bp, const name_t service_name, mach_port_t *sp)
 {
-	return vproc_mig_check_in2(bp, service_name, sp, 0);
+	return vproc_mig_check_in2(bp, (char *)service_name, sp, 0);
 }
 
 kern_return_t
-bootstrap_check_in2(mach_port_t bp, name_t service_name, mach_port_t *sp, uint64_t flags)
+bootstrap_check_in2(mach_port_t bp, const name_t service_name, mach_port_t *sp, uint64_t flags)
 {
-	return vproc_mig_check_in2(bp, service_name, sp, flags);
+	return vproc_mig_check_in2(bp, (char *)service_name, sp, flags);
 }
 
 kern_return_t
-bootstrap_look_up_per_user(mach_port_t bp, name_t service_name, uid_t target_user, mach_port_t *sp)
+bootstrap_look_up_per_user(mach_port_t bp, const name_t service_name, uid_t target_user, mach_port_t *sp)
 {
 	audit_token_t au_tok;
 	struct stat sb;
@@ -154,7 +154,7 @@
 		return kr;
 	}
 
-	kr = vproc_mig_look_up2(puc, service_name, sp, &au_tok, 0, 0);
+	kr = vproc_mig_look_up2(puc, (char *)service_name, sp, &au_tok, 0, 0);
 	mach_port_deallocate(mach_task_self(), puc);
 
 	return kr;
@@ -162,13 +162,13 @@
 
 
 kern_return_t
-bootstrap_look_up(mach_port_t bp, name_t service_name, mach_port_t *sp)
+bootstrap_look_up(mach_port_t bp, const name_t service_name, mach_port_t *sp)
 {
 	return bootstrap_look_up2(bp, service_name, sp, 0, 0);
 }
 
 kern_return_t
-bootstrap_look_up2(mach_port_t bp, name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags)
+bootstrap_look_up2(mach_port_t bp, const name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags)
 {
 	static pthread_mutex_t bslu2_lock = PTHREAD_MUTEX_INITIALIZER;
 	static mach_port_t prev_bp;
@@ -197,7 +197,7 @@
 	}
 
 skip_cache:
-	if ((kr = vproc_mig_look_up2(bp, service_name, sp, &au_tok, target_pid, flags)) != VPROC_ERR_TRY_PER_USER) {
+	if ((kr = vproc_mig_look_up2(bp, (char *)service_name, sp, &au_tok, target_pid, flags)) != VPROC_ERR_TRY_PER_USER) {
 		goto out;
 	}
 
@@ -205,7 +205,7 @@
 		goto out;
 	}
 
-	kr = vproc_mig_look_up2(puc, service_name, sp, &au_tok, target_pid, flags);
+	kr = vproc_mig_look_up2(puc, (char *)service_name, sp, &au_tok, target_pid, flags);
 	mach_port_deallocate(mach_task_self(), puc);
 
 out:

Modified: trunk/launchd/src/libbootstrap_private.h
===================================================================
--- trunk/launchd/src/libbootstrap_private.h	2008-08-28 19:39:50 UTC (rev 23707)
+++ trunk/launchd/src/libbootstrap_private.h	2008-08-29 23:23:53 UTC (rev 23708)
@@ -34,11 +34,11 @@
 
 kern_return_t bootstrap_register2(mach_port_t bp, name_t service_name, mach_port_t sp, uint64_t flags);
 
-kern_return_t bootstrap_look_up2(mach_port_t bp, name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags);
+kern_return_t bootstrap_look_up2(mach_port_t bp, const name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags);
 
-kern_return_t bootstrap_check_in2(mach_port_t bp, name_t service_name, mach_port_t *sp, uint64_t flags);
+kern_return_t bootstrap_check_in2(mach_port_t bp, const name_t service_name, mach_port_t *sp, uint64_t flags);
 
-kern_return_t bootstrap_look_up_per_user(mach_port_t bp, name_t service_name, uid_t target_user, mach_port_t *sp);
+kern_return_t bootstrap_look_up_per_user(mach_port_t bp, const name_t service_name, uid_t target_user, mach_port_t *sp);
 
 kern_return_t bootstrap_set_policy(mach_port_t bp, pid_t target_pid, uint64_t flags, const char *target_service);
 

Modified: trunk/launchd/src/libbootstrap_public.h
===================================================================
--- trunk/launchd/src/libbootstrap_public.h	2008-08-28 19:39:50 UTC (rev 23707)
+++ trunk/launchd/src/libbootstrap_public.h	2008-08-29 23:23:53 UTC (rev 23708)
@@ -306,7 +306,7 @@
  */
 kern_return_t bootstrap_check_in(
 		mach_port_t bp,
-		name_t service_name,
+		const name_t service_name,
 		mach_port_t *sp);
 
 /*
@@ -321,7 +321,7 @@
  */
 kern_return_t bootstrap_look_up(
 		mach_port_t bp,
-		name_t service_name,
+		const name_t service_name,
 		mach_port_t *sp);
 
 /*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20080829/c619bc5b/attachment.html 


More information about the launchd-changes mailing list