[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