Revision: 23708 http://trac.macosforge.org/projects/launchd/changeset/23708 Author: dsorresso@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); /*