From source_changes at macosforge.org Mon May 7 14:15:05 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:47 2007 Subject: [launchd-changes] [23242] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070507211505.E27605E646B@cvs.opensource.apple.com> Revision: 23242 http://trac.macosforge.org/projects/launchd/changeset/23242 Author: zarzycki@apple.com Date: 2007-05-07 14:15:05 -0700 (Mon, 07 May 2007) Log Message: ----------- Log: launchd_core_logic.c:1986 (23240):2: (flags & EV_ONESHOT) Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-04-27 20:29:41 UTC (rev 23241) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-07 21:15:05 UTC (rev 23242) @@ -997,12 +997,8 @@ } if (jobmgr_assumes(jm, (jr = job_new(jm, AUTO_PICK_LEGACY_LABEL, kp.kp_proc.p_comm, NULL)) != NULL)) { - u_int proc_fflags = NOTE_EXEC|NOTE_EXIT; + u_int proc_fflags = NOTE_EXEC|NOTE_EXIT|NOTE_REAP; -#ifdef NOTE_REAP - proc_fflags |= NOTE_REAP; -#endif - total_children++; jr->anonymous = true; jr->p = anonpid; @@ -1983,22 +1979,22 @@ } if (fflags & NOTE_EXIT) { - job_assumes(j, (flags & EV_ONESHOT)); - job_assumes(j, (flags & EV_EOF)); job_reap(j); if (j->anonymous) { job_remove(j); + j = NULL; } else { j = job_dispatch(j, false); } } -#ifdef NOTE_REAP if (j && (fflags & NOTE_REAP)) { + job_assumes(j, flags & EV_ONESHOT); + job_assumes(j, flags & EV_EOF); + job_assumes(j, j->p == 0); } -#endif } void @@ -2121,12 +2117,8 @@ pid_t c; bool sipc = false; time_t td; - u_int proc_fflags = /* NOTE_EXEC|NOTE_FORK| */ NOTE_EXIT; + u_int proc_fflags = /* NOTE_EXEC|NOTE_FORK| */ NOTE_EXIT|NOTE_REAP; -#ifdef NOTE_REAP - proc_fflags |= NOTE_REAP; -#endif - if (!job_assumes(j, j->mgr != NULL)) { return; } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070507/dc2dd144/attachment.html From source_changes at macosforge.org Mon May 7 14:20:33 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:47 2007 Subject: [launchd-changes] [23243] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070507212033.52D7D5E647A@cvs.opensource.apple.com> Revision: 23243 http://trac.macosforge.org/projects/launchd/changeset/23243 Author: zarzycki@apple.com Date: 2007-05-07 14:20:33 -0700 (Mon, 07 May 2007) Log Message: ----------- 9A430: launchd complains about ProgramArguments key Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-07 21:15:05 UTC (rev 23242) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-07 21:20:33 UTC (rev 23243) @@ -1460,6 +1460,12 @@ const char *str; switch (key[0]) { + case 'p': + case 'P': + if (strcasecmp(key, LAUNCH_JOBKEY_PROGRAMARGUMENTS) == 0) { + return; + } + break; case 'l': case 'L': if (strcasecmp(key, LAUNCH_JOBKEY_LIMITLOADTOHOSTS) == 0) { -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070507/5527dc9c/attachment.html From source_changes at macosforge.org Mon May 7 14:41:44 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:47 2007 Subject: [launchd-changes] [23244] trunk/launchd/src/launchd_runtime.c Message-ID: <20070507214144.06E4D5E649F@cvs.opensource.apple.com> Revision: 23244 http://trac.macosforge.org/projects/launchd/changeset/23244 Author: zarzycki@apple.com Date: 2007-05-07 14:41:43 -0700 (Mon, 07 May 2007) Log Message: ----------- Logging updates. Modified Paths: -------------- trunk/launchd/src/launchd_runtime.c Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2007-05-07 21:20:33 UTC (rev 23243) +++ trunk/launchd/src/launchd_runtime.c 2007-05-07 21:41:43 UTC (rev 23244) @@ -261,6 +261,7 @@ } FLAGIF(EV_ADD) + else FLAGIF(EV_RECEIPT) else FLAGIF(EV_DELETE) else FLAGIF(EV_ENABLE) else FLAGIF(EV_DISABLE) @@ -325,8 +326,10 @@ } FFLAGIF(NOTE_EXIT) + else FFLAGIF(NOTE_REAP) else FFLAGIF(NOTE_FORK) else FFLAGIF(NOTE_EXEC) + else FFLAGIF(NOTE_SIGNAL) else FFLAGIF(NOTE_TRACK) else FFLAGIF(NOTE_TRACKERR) else FFLAGIF(NOTE_CHILD) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070507/69c25e45/attachment.html From source_changes at macosforge.org Mon May 7 14:52:13 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:47 2007 Subject: [launchd-changes] [23245] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070507215213.005655E64C5@cvs.opensource.apple.com> Revision: 23245 http://trac.macosforge.org/projects/launchd/changeset/23245 Author: zarzycki@apple.com Date: 2007-05-07 14:52:13 -0700 (Mon, 07 May 2007) Log Message: ----------- 9A423: Bugs reported by launchd Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-07 21:41:43 UTC (rev 23244) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-07 21:52:13 UTC (rev 23245) @@ -931,7 +931,7 @@ return NULL; } - job_reparent_hack(jr, "Aqua"); + job_reparent_hack(jr, NULL); if (getpid() == 1) { struct ldcred ldc; @@ -5155,7 +5155,14 @@ { jobmgr_t jmi = NULL; - if (strcasecmp(where, "Aqua") != 0 && strcasecmp(where, "LoginWindow") != 0) { + /* NULL is only passed for our custom API for LaunchServices. If that is the case, we do magic. */ + if (where == NULL) { + if (strcasecmp(j->mgr->name, "LoginWindow") == 0) { + where = "LoginWindow"; + } else { + where = "Aqua"; + } + } else if (strcasecmp(where, "Aqua") != 0 && strcasecmp(where, "LoginWindow") != 0) { return; } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070507/b57007b1/attachment.html From source_changes at macosforge.org Tue May 8 11:17:51 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:47 2007 Subject: [launchd-changes] [23246] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070508181751.1CDF65E7815@cvs.opensource.apple.com> Revision: 23246 http://trac.macosforge.org/projects/launchd/changeset/23246 Author: zarzycki@apple.com Date: 2007-05-08 11:17:51 -0700 (Tue, 08 May 2007) Log Message: ----------- Improved logging. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-07 21:52:13 UTC (rev 23245) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-08 18:17:51 UTC (rev 23246) @@ -1670,7 +1670,8 @@ job_t ji; if (jm->jm_port == mport) { - return jobmgr_find_by_pid(jm, upid, true); + jobmgr_assumes(jm, (ji = jobmgr_find_by_pid(jm, upid, true)) != NULL); + return ji; } SLIST_FOREACH(jmi, &jm->submgrs, sle) { @@ -1708,7 +1709,7 @@ mib[3] = ldc.pid; if (jobmgr_assumes(root_jobmgr, sysctl(mib, 4, &kp, &len, NULL, 0) != -1)) { - jobmgr_log(root_jobmgr, LOG_ERR, "%s() was confused by PID %u: %s", __func__, ldc.pid, kp.kp_proc.p_comm); + jobmgr_log(root_jobmgr, LOG_ERR, "%s() was confused by PID %u UID %u EUID %u Mach Port 0x%x: %s", __func__, ldc.pid, ldc.uid, ldc.euid, p, kp.kp_proc.p_comm); } } @@ -5226,7 +5227,8 @@ goto out; } - if (getpid() != 1 && job_mig_intran(target_subset)) { + /* We call job_mig_intran2 because job_mig_intran logs on failure */ + if (getpid() != 1 && job_mig_intran2(root_jobmgr, target_subset, getpid())) { kr = 0; goto out; } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070508/365625ae/attachment.html From source_changes at macosforge.org Tue May 8 12:23:04 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:47 2007 Subject: [launchd-changes] [23247] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070508192304.DF6DC5E78D7@cvs.opensource.apple.com> Revision: 23247 http://trac.macosforge.org/projects/launchd/changeset/23247 Author: zarzycki@apple.com Date: 2007-05-08 12:23:04 -0700 (Tue, 08 May 2007) Log Message: ----------- 9A422: Finder, Dock and SystemUIServer don't launch during login Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-08 18:17:51 UTC (rev 23246) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-08 19:23:04 UTC (rev 23247) @@ -1877,6 +1877,10 @@ jobmgr_t jmi, jmn; job_t ji, jn; + if (jm->shutting_down) { + return; + } + SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) { jobmgr_dispatch_all(jmi, newmounthack); } @@ -3950,6 +3954,10 @@ job_assumes(j, launchd_mport_deallocate(ms->port) == KERN_SUCCESS); + if (ms->port == the_exception_server) { + the_exception_server = 0; + } + job_log(j, LOG_INFO, "Mach service deleted%s: %s", port_died ? " (port died)" : "", ms->name); SLIST_REMOVE(&j->machservices, ms, machservice, sle); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070508/85ed9f49/attachment.html From source_changes at macosforge.org Tue May 8 13:43:53 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23248] tags/launchd-215/ Message-ID: <20070508204353.B4CA15E7A38@cvs.opensource.apple.com> Revision: 23248 http://trac.macosforge.org/projects/launchd/changeset/23248 Author: zarzycki@apple.com Date: 2007-05-08 13:43:52 -0700 (Tue, 08 May 2007) Log Message: ----------- "Tagging launchd-215 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-215/ Copied: tags/launchd-215 (from rev 23247, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070508/dcd25d05/attachment.html From source_changes at macosforge.org Wed May 9 10:12:03 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23249] trunk/launchd/src/libvproc.c Message-ID: <20070509171203.F132E5E8872@cvs.opensource.apple.com> Revision: 23249 http://trac.macosforge.org/projects/launchd/changeset/23249 Author: zarzycki@apple.com Date: 2007-05-09 10:12:03 -0700 (Wed, 09 May 2007) Log Message: ----------- _vprocmgr_move_subset_to_user should set mach exception port Modified Paths: -------------- trunk/launchd/src/libvproc.c Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2007-05-08 20:43:52 UTC (rev 23248) +++ trunk/launchd/src/libvproc.c 2007-05-09 17:12:03 UTC (rev 23249) @@ -103,7 +103,7 @@ } } - return NULL; + return _vproc_post_fork_ping(); } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070509/50cb667e/attachment.html From source_changes at macosforge.org Thu May 10 14:23:35 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23250] trunk/launchd/src Message-ID: <20070510212335.7804A5E9D95@cvs.opensource.apple.com> Revision: 23250 http://trac.macosforge.org/projects/launchd/changeset/23250 Author: zarzycki@apple.com Date: 2007-05-10 14:23:35 -0700 (Thu, 10 May 2007) Log Message: ----------- Let's start using the EV_RECEIPT feature I added to the kernel kqueue logic. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_runtime.c trunk/launchd/src/launchd_runtime.h Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-09 17:12:03 UTC (rev 23249) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-10 21:23:35 UTC (rev 23250) @@ -3068,6 +3068,7 @@ void socketgroup_watch(job_t j, struct socketgroup *sg) { + struct kevent kev[sg->fd_cnt]; char buf[10000]; unsigned int i, buf_off = 0; @@ -3081,8 +3082,16 @@ job_log(j, LOG_DEBUG, "Watching sockets:%s", buf); for (i = 0; i < sg->fd_cnt; i++) { - job_assumes(j, kevent_mod(sg->fds[i], EVFILT_READ, EV_ADD, 0, 0, j) != -1); + EV_SET(&kev[i], sg->fds[i], EVFILT_READ, EV_ADD, 0, 0, j); } + + job_assumes(j, kevent_bulk_mod(kev, sg->fd_cnt) != -1); + + for (i = 0; i < sg->fd_cnt; i++) { + job_assumes(j, kev[i].flags & EV_ERROR); + errno = kev[i].data; + job_assumes(j, kev[i].data == 0); + } } void Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2007-05-09 17:12:03 UTC (rev 23249) +++ trunk/launchd/src/launchd_runtime.c 2007-05-10 21:23:35 UTC (rev 23250) @@ -676,6 +676,18 @@ } int +kevent_bulk_mod(struct kevent *kev, size_t kev_cnt) +{ + size_t i; + + for (i = 0; i < kev_cnt; i++) { + kev[i].flags |= EV_CLEAR|EV_RECEIPT; + } + + return kevent(mainkq, kev, kev_cnt, kev, kev_cnt, NULL); +} + +int kevent_mod(uintptr_t ident, short filter, u_short flags, u_int fflags, intptr_t data, void *udata) { struct kevent kev; Modified: trunk/launchd/src/launchd_runtime.h =================================================================== --- trunk/launchd/src/launchd_runtime.h 2007-05-09 17:12:03 UTC (rev 23249) +++ trunk/launchd/src/launchd_runtime.h 2007-05-10 21:23:35 UTC (rev 23250) @@ -71,6 +71,7 @@ const char *reboot_flags_to_C_names(unsigned int flags); +int kevent_bulk_mod(struct kevent *kev, size_t kev_cnt); int kevent_mod(uintptr_t ident, short filter, u_short flags, u_int fflags, intptr_t data, void *udata); pid_t runtime_fork(mach_port_t bsport); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070510/fc165109/attachment.html From source_changes at macosforge.org Thu May 10 14:36:14 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23251] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070510213614.734BA5E9DAC@cvs.opensource.apple.com> Revision: 23251 http://trac.macosforge.org/projects/launchd/changeset/23251 Author: zarzycki@apple.com Date: 2007-05-10 14:36:14 -0700 (Thu, 10 May 2007) Log Message: ----------- socketgroup_watch() and socketgroup_ignore() are basically the same, with slightly different args. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-10 21:23:35 UTC (rev 23250) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-10 21:36:14 UTC (rev 23251) @@ -3045,29 +3045,9 @@ free(sg); } -void -socketgroup_ignore(job_t j, struct socketgroup *sg) +static void +socketgroup_kevent_mod(job_t j, struct socketgroup *sg, bool do_add) { - char buf[10000]; - unsigned int i, buf_off = 0; - - if (sg->junkfds) { - return; - } - - for (i = 0; i < sg->fd_cnt; i++) - buf_off += snprintf(buf + buf_off, sizeof(buf) - buf_off, " %d", sg->fds[i]); - - job_log(j, LOG_DEBUG, "Ignoring Sockets:%s", buf); - - for (i = 0; i < sg->fd_cnt; i++) { - job_assumes(j, kevent_mod(sg->fds[i], EVFILT_READ, EV_DELETE, 0, 0, NULL) != -1); - } -} - -void -socketgroup_watch(job_t j, struct socketgroup *sg) -{ struct kevent kev[sg->fd_cnt]; char buf[10000]; unsigned int i, buf_off = 0; @@ -3076,15 +3056,13 @@ return; } - for (i = 0; i < sg->fd_cnt; i++) - buf_off += snprintf(buf + buf_off, sizeof(buf) - buf_off, " %d", sg->fds[i]); - - job_log(j, LOG_DEBUG, "Watching sockets:%s", buf); - for (i = 0; i < sg->fd_cnt; i++) { - EV_SET(&kev[i], sg->fds[i], EVFILT_READ, EV_ADD, 0, 0, j); + EV_SET(&kev[i], sg->fds[i], EVFILT_READ, do_add ? EV_ADD : EV_DELETE, 0, 0, j); + buf_off += snprintf(buf + buf_off, sizeof(buf) - buf_off, " %d", sg->fds[i]); } + job_log(j, LOG_DEBUG, "%s Sockets:%s", do_add ? "Watching" : "Ignoring", buf); + job_assumes(j, kevent_bulk_mod(kev, sg->fd_cnt) != -1); for (i = 0; i < sg->fd_cnt; i++) { @@ -3095,6 +3073,18 @@ } void +socketgroup_ignore(job_t j, struct socketgroup *sg) +{ + socketgroup_kevent_mod(j, sg, false); +} + +void +socketgroup_watch(job_t j, struct socketgroup *sg) +{ + socketgroup_kevent_mod(j, sg, true); +} + +void socketgroup_callback(job_t j) { job_dispatch(j, true); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070510/5ba0b7c9/attachment.html From source_changes at macosforge.org Thu May 10 15:34:46 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23252] trunk/launchd/src Message-ID: <20070510223446.2A0365E9EA8@cvs.opensource.apple.com> Revision: 23252 http://trac.macosforge.org/projects/launchd/changeset/23252 Author: zarzycki@apple.com Date: 2007-05-10 15:34:45 -0700 (Thu, 10 May 2007) Log Message: ----------- Some developers seem to be just making up keys... Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/liblaunch_private.h Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-10 21:36:14 UTC (rev 23251) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-10 22:34:45 UTC (rev 23252) @@ -1159,47 +1159,64 @@ void job_import_bool(job_t j, const char *key, bool value) { + bool found_key = false; + switch (key[0]) { case 'k': case 'K': if (strcasecmp(key, LAUNCH_JOBKEY_KEEPALIVE) == 0) { j->ondemand = !value; + found_key = true; } break; case 'o': case 'O': if (strcasecmp(key, LAUNCH_JOBKEY_ONDEMAND) == 0) { j->ondemand = value; + found_key = true; } break; case 'd': case 'D': if (strcasecmp(key, LAUNCH_JOBKEY_DEBUG) == 0) { j->debug = value; + found_key = true; + } else if (strcasecmp(key, LAUNCH_JOBKEY_DISABLED) == 0) { + job_assumes(j, !value); + found_key = true; } break; case 'h': case 'H': if (strcasecmp(key, LAUNCH_JOBKEY_HOPEFULLYEXITSLAST) == 0) { j->hopefully_exits_last = value; + found_key = true; } else if (strcasecmp(key, LAUNCH_JOBKEY_HOPEFULLYEXITSFIRST) == 0) { j->hopefully_exits_first = value; + found_key = true; } break; case 's': case 'S': if (strcasecmp(key, LAUNCH_JOBKEY_SESSIONCREATE) == 0) { j->session_create = value; + found_key = true; } else if (strcasecmp(key, LAUNCH_JOBKEY_STARTONMOUNT) == 0) { j->start_on_mount = value; + found_key = true; + } else if (strcasecmp(key, LAUNCH_JOBKEY_SERVICEIPC) == 0) { + /* this only does something on Mac OS X 10.4 "Tiger" */ + found_key = true; } break; case 'l': case 'L': if (strcasecmp(key, LAUNCH_JOBKEY_LOWPRIORITYIO) == 0) { j->low_pri_io = value; + found_key = true; } else if (strcasecmp(key, LAUNCH_JOBKEY_LAUNCHONLYONCE) == 0) { j->only_once = value; + found_key = true; } break; case 'i': @@ -1210,32 +1227,40 @@ return; } j->no_init_groups = !value; + found_key = true; } break; case 'r': case 'R': if (strcasecmp(key, LAUNCH_JOBKEY_RUNATLOAD) == 0) { j->runatload = value; + found_key = true; } break; case 'e': case 'E': if (strcasecmp(key, LAUNCH_JOBKEY_ENABLEGLOBBING) == 0) { j->globargv = value; + found_key = true; } else if (strcasecmp(key, LAUNCH_JOBKEY_ENTERKERNELDEBUGGERBEFOREKILL) == 0) { j->debug_before_kill = value; + found_key = true; } break; case 'w': case 'W': if (strcasecmp(key, LAUNCH_JOBKEY_WAITFORDEBUGGER) == 0) { j->wait4debugger = value; + found_key = true; } break; default: - job_log(j, LOG_WARNING, "Unknown key for boolean: %s", key); break; } + + if (!found_key) { + job_log(j, LOG_WARNING, "Unknown key for boolean: %s", key); + } } void Modified: trunk/launchd/src/liblaunch_private.h =================================================================== --- trunk/launchd/src/liblaunch_private.h 2007-05-10 21:36:14 UTC (rev 23251) +++ trunk/launchd/src/liblaunch_private.h 2007-05-10 22:34:45 UTC (rev 23252) @@ -47,6 +47,7 @@ #define LAUNCH_JOBKEY_ENTERKERNELDEBUGGERBEFOREKILL "EnterKernelDebuggerBeforeKill" #define LAUNCH_JOBKEY_PERJOBMACHSERVICES "PerJobMachServices" +#define LAUNCH_JOBKEY_SERVICEIPC "ServiceIPC" #define LAUNCH_JOBKEY_MACH_KUNCSERVER "kUNCServer" #define LAUNCH_JOBKEY_MACH_EXCEPTIONSERVER "ExceptionServer" -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070510/9f45d589/attachment.html From source_changes at macosforge.org Fri May 11 15:04:44 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23253] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070511220444.BAD815EB80D@cvs.opensource.apple.com> Revision: 23253 http://trac.macosforge.org/projects/launchd/changeset/23253 Author: zarzycki@apple.com Date: 2007-05-11 15:04:44 -0700 (Fri, 11 May 2007) Log Message: ----------- Better symbol exports. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-10 22:34:45 UTC (rev 23252) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-11 22:04:44 UTC (rev 23253) @@ -127,7 +127,7 @@ #define PORT_HASH_SIZE 32 #define HASH_PORT(x) (IS_POWER_OF_TWO(PORT_HASH_SIZE) ? (MACH_PORT_INDEX(x) & (PORT_HASH_SIZE - 1)) : (MACH_PORT_INDEX(x) % PORT_HASH_SIZE)) -LIST_HEAD(, machservice) port_hash[PORT_HASH_SIZE]; +static LIST_HEAD(, machservice) port_hash[PORT_HASH_SIZE]; static void machservice_setup(launch_data_t obj, const char *key, void *context); static void machservice_setup_options(launch_data_t obj, const char *key, void *context); @@ -332,7 +332,7 @@ #define LABEL_HASH_SIZE 53 -LIST_HEAD(, job_s) label_hash[LABEL_HASH_SIZE]; +static LIST_HEAD(, job_s) label_hash[LABEL_HASH_SIZE]; static size_t hash_label(const char *label) __attribute__((pure)); static size_t hash_ms(const char *msstr) __attribute__((pure)); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070511/861e3155/attachment.html From source_changes at macosforge.org Mon May 14 11:32:49 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23254] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070514183249.23E0C5F7695@cvs.opensource.apple.com> Revision: 23254 http://trac.macosforge.org/projects/launchd/changeset/23254 Author: zarzycki@apple.com Date: 2007-05-14 11:32:48 -0700 (Mon, 14 May 2007) Log Message: ----------- Silly {} updates. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-11 22:04:44 UTC (rev 23253) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-14 18:32:48 UTC (rev 23254) @@ -1083,8 +1083,9 @@ while (*argv_tmp++) j->argc++; - for (i = 0; i < j->argc; i++) + for (i = 0; i < j->argc; i++) { cc += strlen(argv[i]) + 1; + } j->argv = malloc((j->argc + 1) * sizeof(char *) + cc); @@ -2320,8 +2321,9 @@ } else if (j->argv) { argv = alloca((j->argc + 2) * sizeof(char *)); argv[0] = file2exec; - for (i = 0; i < j->argc; i++) + for (i = 0; i < j->argc; i++) { argv[i + 1] = j->argv[i]; + } argv[i + 1] = NULL; } else { argv = alloca(3 * sizeof(char *)); @@ -3061,8 +3063,9 @@ { unsigned int i; - for (i = 0; i < sg->fd_cnt; i++) + for (i = 0; i < sg->fd_cnt; i++) { job_assumes(j, runtime_close(sg->fds[i]) != -1); + } SLIST_REMOVE(&j->sockets, sg, socketgroup, sle); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070514/621bd5bc/attachment.html From source_changes at macosforge.org Thu May 17 14:07:39 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23255] trunk/launchd/src Message-ID: <20070517210739.E55D75FFF18@cvs.opensource.apple.com> Revision: 23255 http://trac.macosforge.org/projects/launchd/changeset/23255 Author: zarzycki@apple.com Date: 2007-05-17 14:07:38 -0700 (Thu, 17 May 2007) Log Message: ----------- Leopard9A429: Cannot ssh into my machine Modified Paths: -------------- trunk/launchd/src/launchctl.c trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/liblaunch.c trunk/launchd/src/libvproc.c trunk/launchd/src/libvproc_internal.h trunk/launchd/src/libvproc_private.h Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2007-05-14 18:32:48 UTC (rev 23254) +++ trunk/launchd/src/launchctl.c 2007-05-17 21:07:38 UTC (rev 23255) @@ -1929,7 +1929,7 @@ } int -list_cmd(int argc, char *const argv[] __attribute__((unused))) +list_cmd(int argc, char *const argv[]) { launch_data_t resp, msg; int r = 0; Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-14 18:32:48 UTC (rev 23254) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-17 21:07:38 UTC (rev 23255) @@ -244,7 +244,7 @@ unsigned int global_on_demand_cnt; unsigned int hopefully_first_cnt; unsigned int normal_active_cnt; - unsigned int sent_stop_to_normal_jobs:1, sent_stop_to_hopefully_last_jobs:1, shutting_down:1; + unsigned int sent_stop_to_normal_jobs:1, sent_stop_to_hopefully_last_jobs:1, shutting_down:1, session_initialized:1; char name[0]; }; @@ -258,6 +258,7 @@ static void jobmgr_log_stray_children(jobmgr_t jm); static void jobmgr_remove(jobmgr_t jm); static void jobmgr_dispatch_all(jobmgr_t jm, bool newmounthack); +static job_t jobmgr_init_session(jobmgr_t jm, const char *session_type, bool sflag); static job_t jobmgr_find_by_pid(jobmgr_t jm, pid_t p, bool create_anon); static job_t job_mig_intran2(jobmgr_t jm, mach_port_t mport, pid_t upid); static void job_export_all2(jobmgr_t jm, launch_data_t where); @@ -3752,15 +3753,10 @@ jobmgr_t jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag, const char *name) { - const char *bootstrap_tool[] = { "/bin/launchctl", "bootstrap", "-S", name, NULL, NULL }; mach_msg_size_t mxmsgsz; job_t bootstrapper = NULL; jobmgr_t jmr; - if (sflag) { - bootstrap_tool[4] = "-s"; - } - launchd_assert(offsetof(struct jobmgr_s, kqjobmgr_callback) == 0); if (jm && requestorport == MACH_PORT_NULL) { @@ -3836,20 +3832,7 @@ } if (name) { - char thelabel[1000]; - - snprintf(thelabel, sizeof(thelabel), "com.apple.launchctl.%s", name); - /* no name implies: bootstrap_subset() where creating a "bootstrapper" makes no sense */ - bootstrapper = job_new(jmr, thelabel, NULL, bootstrap_tool); - if (jobmgr_assumes(jmr, bootstrapper != NULL) && (jm || getuid())) { - char buf[100]; - - /* launchd-201: can't ssh in with AFP OD account (hangs) */ - snprintf(buf, sizeof(buf), "0x%X:0:0", getuid()); - envitem_new(bootstrapper, "__CF_USER_TEXT_ENCODING", buf, false); - bootstrapper->weird_bootstrap = true; - jobmgr_assumes(jmr, job_setup_machport(bootstrapper)); - } + bootstrapper = jobmgr_init_session(jmr, name, sflag); } if (!bootstrapper || !bootstrapper->weird_bootstrap) { @@ -3873,6 +3856,30 @@ return NULL; } +job_t +jobmgr_init_session(jobmgr_t jm, const char *session_type, bool sflag) +{ + const char *bootstrap_tool[] = { "/bin/launchctl", "bootstrap", "-S", session_type, sflag ? "-s" : NULL, NULL }; + char thelabel[1000]; + job_t bootstrapper; + + snprintf(thelabel, sizeof(thelabel), "com.apple.launchctl.%s", session_type); + bootstrapper = job_new(jm, thelabel, NULL, bootstrap_tool); + if (jobmgr_assumes(jm, bootstrapper != NULL) && (jm->parentmgr || getuid())) { + char buf[100]; + + /* launchd-201: can't ssh in with AFP OD account (hangs) */ + snprintf(buf, sizeof(buf), "0x%X:0:0", getuid()); + envitem_new(bootstrapper, "__CF_USER_TEXT_ENCODING", buf, false); + bootstrapper->weird_bootstrap = true; + jobmgr_assumes(jm, job_setup_machport(bootstrapper)); + } + + jm->session_initialized = true; + + return bootstrapper; +} + jobmgr_t jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port) { @@ -4871,20 +4878,19 @@ return BOOTSTRAP_NO_MEMORY; } + job_log(j, LOG_DEBUG, "Looking up per user launchd for UID: %u", which_user); + + runtime_get_caller_creds(&ldc); + if (getpid() != 1) { + job_log(j, LOG_ERR, "Only PID 1 supports per user launchd lookups."); return BOOTSTRAP_NOT_PRIVILEGED; } - runtime_get_caller_creds(&ldc); - if (ldc.euid || ldc.uid) { which_user = ldc.euid ? ldc.euid : ldc.uid; } - if (which_user == 0) { - return BOOTSTRAP_NOT_PRIVILEGED; - } - *up_cont = MACH_PORT_NULL; LIST_FOREACH(ji, &root_jobmgr->jobs, sle) { @@ -4907,6 +4913,8 @@ struct machservice *ms; char lbuf[1024]; + job_log(j, LOG_DEBUG, "Creating per user launchd job for UID: %u", which_user); + sprintf(lbuf, "com.apple.launchd.peruser.%u", which_user); ji = job_new(root_jobmgr, lbuf, "/sbin/launchd", NULL); @@ -4927,6 +4935,8 @@ ms->hide = true; ji = job_dispatch(ji, false); + } else { + job_log(j, LOG_DEBUG, "Per user launchd job found for UID: %u", which_user); } if (job_assumes(j, ji != NULL)) { @@ -5238,37 +5248,45 @@ mach_port_array_t l2l_ports = NULL; mach_port_t reqport, rcvright; kern_return_t kr = 1; + struct ldcred ldc; jobmgr_t jmr = NULL; - job_t j2; - if (getuid() == 0) { - const char *bootstrap_tool[] = { "/bin/launchctl", "bootstrap", "-S", session_type, NULL }; - char thelabel[1000]; - job_t bootstrapper; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } - snprintf(thelabel, sizeof(thelabel), "com.apple.launchctl.%s", session_type); + runtime_get_caller_creds(&ldc); - job_assumes(j, (j2 = job_mig_intran(target_subset)) != NULL); - j = j2; + if (target_subset == MACH_PORT_NULL) { + job_t j2; + + if (j->mgr->session_initialized) { + job_log(j, LOG_ERR, "Tried to initialize an already setup session!"); + kr = BOOTSTRAP_NOT_PRIVILEGED; + goto out; + } + jobmgr_log(j->mgr, LOG_DEBUG, "Renaming to: %s", session_type); strcpy(j->mgr->name, session_type); - bootstrapper = job_new(j->mgr, thelabel, NULL, bootstrap_tool); - if (job_assumes(j, bootstrapper != NULL)) { - job_dispatch(bootstrapper, true); + if (job_assumes(j, (j2 = jobmgr_init_session(j->mgr, session_type, false)))) { + job_assumes(j, job_dispatch(j2, true)); } kr = 0; goto out; - } + } else if (job_mig_intran2(root_jobmgr, target_subset, ldc.pid)) { + job_log(j, LOG_ERR, "Moving a session to ourself is bogus."); - /* We call job_mig_intran2 because job_mig_intran logs on failure */ - if (getpid() != 1 && job_mig_intran2(root_jobmgr, target_subset, getpid())) { - kr = 0; + kr = BOOTSTRAP_NOT_PRIVILEGED; goto out; } - if (!job_assumes(j, (kr = _vproc_grab_subset(target_subset, &reqport, &rcvright, &l2l_names, &l2l_name_cnt, &l2l_pids, &l2l_pid_cnt, &l2l_ports, &l2l_port_cnt)) == 0)) { + job_log(j, LOG_DEBUG, "Move subset attempt: 0x%x", target_subset); + + kr = _vproc_grab_subset(target_subset, &reqport, &rcvright, &l2l_names, &l2l_name_cnt, &l2l_pids, &l2l_pid_cnt, &l2l_ports, &l2l_port_cnt); + + if (!job_assumes(j, kr == 0)) { goto out; } @@ -5308,7 +5326,9 @@ } if (kr == 0) { - job_assumes(j, launchd_mport_deallocate(target_subset) == KERN_SUCCESS); + if (target_subset) { + job_assumes(j, launchd_mport_deallocate(target_subset) == KERN_SUCCESS); + } } else if (jmr) { jobmgr_shutdown(jmr); } Modified: trunk/launchd/src/liblaunch.c =================================================================== --- trunk/launchd/src/liblaunch.c 2007-05-14 18:32:48 UTC (rev 23254) +++ trunk/launchd/src/liblaunch.c 2007-05-17 21:07:38 UTC (rev 23255) @@ -1204,7 +1204,7 @@ void load_launchd_jobs_at_loginwindow_prompt(int flags __attribute__((unused)), ...) { - _vprocmgr_move_subset_to_user(geteuid() ? geteuid() : getuid(), "LoginWindow"); + _vprocmgr_init("LoginWindow"); } pid_t Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2007-05-14 18:32:48 UTC (rev 23254) +++ trunk/launchd/src/libvproc.c 2007-05-17 21:07:38 UTC (rev 23255) @@ -30,6 +30,7 @@ #include #include #include +#include #include "liblaunch_public.h" #include "liblaunch_private.h" @@ -65,28 +66,70 @@ } vproc_err_t -_vprocmgr_move_subset_to_user(uid_t target_user, char *session_type) +_vprocmgr_init(const char *session_type) { + if (vproc_mig_move_subset(bootstrap_port, MACH_PORT_NULL, (char *)session_type) == 0) { + return NULL; + } + + return (vproc_err_t)_vprocmgr_init; +} + +vproc_err_t +_vprocmgr_move_subset_to_user(uid_t target_user, const char *session_type) +{ launch_data_t output_obj; kern_return_t kr = 1; - mach_port_t puc = 0, which_port = bootstrap_port; + mach_port_t puc = 0, rootbs = get_root_bootstrap_port(); bool is_bkgd = (strcmp(session_type, VPROCMGR_SESSION_BACKGROUND) == 0); + int64_t ldpid, lduid; - if (target_user && vproc_mig_lookup_per_user_context(get_root_bootstrap_port(), target_user, &puc) == 0) { - which_port = puc; + if (vproc_swap_integer(NULL, VPROC_GSK_MGR_PID, 0, &ldpid) != 0) { + return (vproc_err_t)_vprocmgr_move_subset_to_user; } + if (vproc_swap_integer(NULL, VPROC_GSK_MGR_UID, 0, &lduid) != 0) { + return (vproc_err_t)_vprocmgr_move_subset_to_user; + } + + if (target_user == 0) { + if (ldpid == 1 && rootbs != bootstrap_port) { + return _vprocmgr_init(session_type); + } + + task_set_bootstrap_port(mach_task_self(), rootbs); + mach_port_deallocate(mach_task_self(), bootstrap_port); + bootstrap_port = rootbs; + + return NULL; + } + + if (ldpid != 1) { + if (lduid == getuid()) { + return NULL; + } + /* + * Not all sessions can be moved. + * We should clean up this mess someday. + */ + return (vproc_err_t)_vprocmgr_move_subset_to_user; + } + + if (vproc_mig_lookup_per_user_context(rootbs, target_user, &puc) != 0) { + return (vproc_err_t)_vprocmgr_move_subset_to_user; + } + if (is_bkgd) { kr = 0; } else { - kr = vproc_mig_move_subset(which_port, bootstrap_port, session_type); + kr = vproc_mig_move_subset(puc, bootstrap_port, (char *)session_type); } - if (puc && is_bkgd) { + if (is_bkgd) { task_set_bootstrap_port(mach_task_self(), puc); mach_port_deallocate(mach_task_self(), bootstrap_port); bootstrap_port = puc; - } else if (puc) { + } else { mach_port_deallocate(mach_task_self(), puc); } @@ -308,7 +351,9 @@ do { if (previous_port) { - mach_port_deallocate(mach_task_self(), previous_port); + if (previous_port != bootstrap_port) { + mach_port_deallocate(mach_task_self(), previous_port); + } previous_port = parent_port; } else { previous_port = bootstrap_port; Modified: trunk/launchd/src/libvproc_internal.h =================================================================== --- trunk/launchd/src/libvproc_internal.h 2007-05-14 18:32:48 UTC (rev 23254) +++ trunk/launchd/src/libvproc_internal.h 2007-05-17 21:07:38 UTC (rev 23255) @@ -39,6 +39,7 @@ #pragma GCC visibility push(default) +vproc_err_t _vprocmgr_init(const char *session_type); vproc_err_t _vproc_post_fork_ping(void); #define SPAWN_HAS_PATH 0x0001 Modified: trunk/launchd/src/libvproc_private.h =================================================================== --- trunk/launchd/src/libvproc_private.h 2007-05-14 18:32:48 UTC (rev 23254) +++ trunk/launchd/src/libvproc_private.h 2007-05-17 21:07:38 UTC (rev 23255) @@ -63,7 +63,7 @@ #define VPROCMGR_SESSION_STANDARDIO "StandardIO" #define VPROCMGR_SESSION_SYSTEM "System" -vproc_err_t _vprocmgr_move_subset_to_user(uid_t target_user, char *session_type); +vproc_err_t _vprocmgr_move_subset_to_user(uid_t target_user, const char *session_type); #pragma GCC visibility pop -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070517/540ff8ef/attachment.html From source_changes at macosforge.org Thu May 17 15:18:58 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23256] tags/launchd-216/ Message-ID: <20070517221858.2B0C3600190@cvs.opensource.apple.com> Revision: 23256 http://trac.macosforge.org/projects/launchd/changeset/23256 Author: zarzycki@apple.com Date: 2007-05-17 15:18:57 -0700 (Thu, 17 May 2007) Log Message: ----------- "Tagging launchd-216 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-216/ Copied: tags/launchd-216 (from rev 23255, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070517/12281636/attachment.html From source_changes at macosforge.org Fri May 18 12:37:43 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23257] trunk/launchd/src/launchctl.c Message-ID: <20070518193743.BEA9F6021EF@cvs.opensource.apple.com> Revision: 23257 http://trac.macosforge.org/projects/launchd/changeset/23257 Author: zarzycki@apple.com Date: 2007-05-18 12:37:43 -0700 (Fri, 18 May 2007) Log Message: ----------- Bug: launchctl.c:1498 (23236):35: fwexec(bcc_tool, true) != -1 Modified Paths: -------------- trunk/launchd/src/launchctl.c Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2007-05-17 22:18:57 UTC (rev 23256) +++ trunk/launchd/src/launchctl.c 2007-05-18 19:37:43 UTC (rev 23257) @@ -1495,7 +1495,7 @@ return; } - assumes(fwexec(bcc_tool, true) != -1); + fwexec(bcc_tool, true); } int -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070518/e7c85664/attachment.html From source_changes at macosforge.org Tue May 22 10:05:18 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23258] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070522170518.47037612C43@cvs.opensource.apple.com> Revision: 23258 http://trac.macosforge.org/projects/launchd/changeset/23258 Author: zarzycki@apple.com Date: 2007-05-22 10:05:17 -0700 (Tue, 22 May 2007) Log Message: ----------- Security checks. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-18 19:37:43 UTC (rev 23257) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-22 17:05:17 UTC (rev 23258) @@ -4587,11 +4587,18 @@ launch_data_t input_obj, output_obj; size_t data_offset = 0; size_t packed_size; + struct ldcred ldc; + runtime_get_caller_creds(&ldc); + if (!launchd_assumes(j != NULL)) { return BOOTSTRAP_NO_MEMORY; } + if (inkey && ldc.euid && ldc.euid != getuid()) { + return BOOTSTRAP_NOT_PRIVILEGED; + } + if (inkey && outkey && !job_assumes(j, inkey == outkey)) { return 1; } @@ -4673,12 +4680,19 @@ { const char *action; kern_return_t kr = 0; + struct ldcred ldc; int oldmask; + runtime_get_caller_creds(&ldc); + if (!launchd_assumes(j != NULL)) { return BOOTSTRAP_NO_MEMORY; } + if (inkey && ldc.euid && ldc.euid != getuid()) { + return BOOTSTRAP_NOT_PRIVILEGED; + } + if (inkey && outkey && !job_assumes(j, inkey == outkey)) { return 1; } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070522/6a74c220/attachment.html From source_changes at macosforge.org Tue May 22 13:03:44 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23259] trunk/launchd/src/launchd_runtime.c Message-ID: <20070522200344.00FFC61304E@cvs.opensource.apple.com> Revision: 23259 http://trac.macosforge.org/projects/launchd/changeset/23259 Author: zarzycki@apple.com Date: 2007-05-22 13:03:44 -0700 (Tue, 22 May 2007) Log Message: ----------- "launchctl unload" hangs Modified Paths: -------------- trunk/launchd/src/launchd_runtime.c Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2007-05-22 17:05:17 UTC (rev 23258) +++ trunk/launchd/src/launchd_runtime.c 2007-05-22 20:03:44 UTC (rev 23259) @@ -693,10 +693,18 @@ struct kevent kev; int q = mainkq; - flags |= EV_CLEAR; - - if (EVFILT_TIMER == filter || EVFILT_VNODE == filter) { + switch (filter) { + case EVFILT_READ: + case EVFILT_WRITE: + break; + case EVFILT_TIMER: + case EVFILT_VNODE: + case EVFILT_FS: q = asynckq; + /* fall through */ + default: + flags |= EV_CLEAR; + break; } if (flags & EV_ADD && !launchd_assumes(udata != NULL)) { -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070522/00596b7c/attachment.html From source_changes at macosforge.org Tue May 22 13:08:55 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23260] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070522200855.AF9CB61305E@cvs.opensource.apple.com> Revision: 23260 http://trac.macosforge.org/projects/launchd/changeset/23260 Author: zarzycki@apple.com Date: 2007-05-22 13:08:55 -0700 (Tue, 22 May 2007) Log Message: ----------- bootstrap_set_policy: policy should be inherited Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-22 20:03:44 UTC (rev 23259) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-22 20:08:55 UTC (rev 23260) @@ -107,7 +107,8 @@ const char name[0]; }; -static bool mspolicy_new(job_t j, const char *name, bool allow, bool pid_local); +static bool mspolicy_new(job_t j, const char *name, bool allow, bool pid_local, bool skip_check); +static bool mspolicy_copy(job_t j_to, job_t j_from); static void mspolicy_setup(launch_data_t obj, const char *key, void *context); static bool mspolicy_check(job_t j, const char *name, bool pid_local); static void mspolicy_delete(job_t j, struct mspolicy *msp); @@ -977,19 +978,28 @@ job_new_anonymous(jobmgr_t jm, pid_t anonpid) { int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, anonpid }; - struct kinfo_proc kp, ppid_kp; + struct kinfo_proc kp; size_t len = sizeof(kp); bool shutdown_state; - job_t jr = NULL; + job_t jp = NULL, jr = NULL; if (!jobmgr_assumes(jm, sysctl(mib, 4, &kp, &len, NULL, 0) != -1)) { return NULL; } - mib[3] = kp.kp_eproc.e_ppid; - - if (!jobmgr_assumes(jm, sysctl(mib, 4, &ppid_kp, &len, NULL, 0) != -1)) { - return NULL; + switch (kp.kp_eproc.e_ppid) { + case 0: + /* the kernel */ + break; + case 1: + if (getpid() != 1) { + break; + } + /* fall through */ + default: + jp = jobmgr_find_by_pid(jm, kp.kp_eproc.e_ppid, true); + jobmgr_assumes(jm, jp != NULL); + break; } /* A total hack: Normally, job_new() returns an error during shutdown, but anonymous jobs are special. */ @@ -1003,14 +1013,20 @@ total_children++; jr->anonymous = true; jr->p = anonpid; + /* anonymous process reaping is messy */ LIST_INSERT_HEAD(&jm->active_jobs[ACTIVE_JOB_HASH(jr->p)], jr, pid_hash_sle); job_assumes(jr, kevent_mod(jr->p, EVFILT_PROC, EV_ADD, proc_fflags, 0, root_jobmgr) != -1); + + if (jp) { + job_assumes(jr, mspolicy_copy(jr, jp)); + } + if (shutdown_state && jm->hopefully_first_cnt == 0) { - job_log(jr, LOG_APPLEONLY, "This process showed up to the party while all the guests were leaving. Odds are that it will have a miserable time. Blame PID %u: %s", - kp.kp_eproc.e_ppid, ppid_kp.kp_proc.p_comm); + job_log(jr, LOG_APPLEONLY, "This process showed up to the party while all the guests were leaving. Odds are that it will have a miserable time."); } - job_log(jr, LOG_DEBUG, "Created anonymously by PPID %u: %s", kp.kp_eproc.e_ppid, ppid_kp.kp_proc.p_comm); + + job_log(jr, LOG_DEBUG, "Created anonymously by PPID %u%s%s", kp.kp_eproc.e_ppid, jp ? ": " : "", jp ? jp->label : ""); } if (shutdown_state) { @@ -5572,7 +5588,7 @@ if (SLIST_EMPTY(&j->mspolicies)) { job_log(j, LOG_DEBUG, "Setting policy on job \"%s\" for Mach service: %s", target_j->label, target_service); if (target_service[0]) { - job_assumes(j, mspolicy_new(target_j, target_service, flags & BOOTSTRAP_ALLOW_LOOKUP, flags & BOOTSTRAP_PER_PID_SERVICE)); + job_assumes(j, mspolicy_new(target_j, target_service, flags & BOOTSTRAP_ALLOW_LOOKUP, flags & BOOTSTRAP_PER_PID_SERVICE, false)); } else { target_j->deny_unknown_mslookups = !(flags & BOOTSTRAP_ALLOW_LOOKUP); } @@ -5709,11 +5725,25 @@ } bool -mspolicy_new(job_t j, const char *name, bool allow, bool pid_local) +mspolicy_copy(job_t j_to, job_t j_from) { struct mspolicy *msp; - SLIST_FOREACH(msp, &j->mspolicies, sle) { + SLIST_FOREACH(msp, &j_from->mspolicies, sle) { + if (!mspolicy_new(j_to, msp->name, msp->allow, msp->per_pid, true)) { + return false; + } + } + + return true; +} + +bool +mspolicy_new(job_t j, const char *name, bool allow, bool pid_local, bool skip_check) +{ + struct mspolicy *msp; + + if (!skip_check) SLIST_FOREACH(msp, &j->mspolicies, sle) { if (msp->per_pid != pid_local) { continue; } else if (strcmp(msp->name, name) == 0) { @@ -5727,6 +5757,7 @@ strcpy((char *)msp->name, name); msp->per_pid = pid_local; + msp->allow = allow; SLIST_INSERT_HEAD(&j->mspolicies, msp, sle); @@ -5743,7 +5774,7 @@ return; } - job_assumes(j, mspolicy_new(j, key, launch_data_get_bool(obj), false)); + job_assumes(j, mspolicy_new(j, key, launch_data_get_bool(obj), false, false)); } bool -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070522/f3aab5a8/attachment.html From source_changes at macosforge.org Tue May 22 13:22:11 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23261] tags/launchd-217/ Message-ID: <20070522202211.2271C6130A6@cvs.opensource.apple.com> Revision: 23261 http://trac.macosforge.org/projects/launchd/changeset/23261 Author: zarzycki@apple.com Date: 2007-05-22 13:22:10 -0700 (Tue, 22 May 2007) Log Message: ----------- "Tagging launchd-217 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-217/ Copied: tags/launchd-217 (from rev 23260, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070522/86e45480/attachment.html From source_changes at macosforge.org Thu May 24 13:54:11 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23262] trunk/launchd/src Message-ID: <20070524205411.7111661D320@cvs.opensource.apple.com> Revision: 23262 http://trac.macosforge.org/projects/launchd/changeset/23262 Author: zarzycki@apple.com Date: 2007-05-24 13:54:11 -0700 (Thu, 24 May 2007) Log Message: ----------- loginwindow dialogs can't be seen via accessibility Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/libvproc.c trunk/launchd/src/libvproc_internal.h trunk/launchd/src/protocol_job.defs Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-22 20:22:10 UTC (rev 23261) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-24 20:54:11 UTC (rev 23262) @@ -95,6 +95,11 @@ #define LAUNCHD_DEFAULT_EXIT_TIMEOUT 20 #define LAUNCHD_SIGKILL_TIMER 5 + +#define TAKE_SUBSET_NAME "TakeSubsetName" +#define TAKE_SUBSET_PID "TakeSubsetPID" +#define TAKE_SUBSET_PERPID "TakeSubsetPerPID" + #define IS_POWER_OF_TWO(v) (!(v & (v - 1)) && v) extern char **environ; @@ -5272,12 +5277,11 @@ kern_return_t job_mig_move_subset(job_t j, mach_port_t target_subset, name_t session_type) { - mach_msg_type_number_t l2l_i, l2l_name_cnt = 0, l2l_port_cnt = 0, l2l_pid_cnt = 0; - name_array_t l2l_names = NULL; - pid_array_t l2l_pids = NULL; + mach_msg_type_number_t l2l_i, l2l_port_cnt = 0; mach_port_array_t l2l_ports = NULL; mach_port_t reqport, rcvright; kern_return_t kr = 1; + launch_data_t out_obj_array = NULL; struct ldcred ldc; jobmgr_t jmr = NULL; @@ -5314,30 +5318,45 @@ job_log(j, LOG_DEBUG, "Move subset attempt: 0x%x", target_subset); - kr = _vproc_grab_subset(target_subset, &reqport, &rcvright, &l2l_names, &l2l_name_cnt, &l2l_pids, &l2l_pid_cnt, &l2l_ports, &l2l_port_cnt); + kr = _vproc_grab_subset(target_subset, &reqport, &rcvright, &out_obj_array, &l2l_ports, &l2l_port_cnt); + job_log(j, LOG_NOTICE, "@@@@@ kr == 0x%x", kr); + if (!job_assumes(j, kr == 0)) { goto out; } - launchd_assert(l2l_name_cnt == l2l_port_cnt); - launchd_assert(l2l_name_cnt == l2l_pid_cnt); + launchd_assert(launch_data_array_get_count(out_obj_array) == l2l_port_cnt); if (!job_assumes(j, (jmr = jobmgr_new(j->mgr, reqport, rcvright, false, session_type)) != NULL)) { kr = BOOTSTRAP_NO_MEMORY; goto out; } - for (l2l_i = 0; l2l_i < l2l_name_cnt; l2l_i++) { - job_t j_for_service = jobmgr_find_by_pid(jmr, l2l_pids[l2l_i], true); + for (l2l_i = 0; l2l_i < l2l_port_cnt; l2l_i++) { + launch_data_t tmp, obj_at_idx; struct machservice *ms; + job_t j_for_service; + const char *serv_name; + pid_t target_pid; + bool serv_perpid; + job_assumes(j, obj_at_idx = launch_data_array_get_index(out_obj_array, l2l_i)); + job_assumes(j, tmp = launch_data_dict_lookup(obj_at_idx, TAKE_SUBSET_PID)); + job_assumes(j, target_pid = launch_data_get_integer(tmp)); + job_assumes(j, tmp = launch_data_dict_lookup(obj_at_idx, TAKE_SUBSET_PERPID)); + job_assumes(j, serv_perpid = launch_data_get_bool(tmp)); + job_assumes(j, tmp = launch_data_dict_lookup(obj_at_idx, TAKE_SUBSET_NAME)); + job_assumes(j, serv_name = launch_data_get_string(tmp)); + + j_for_service = jobmgr_find_by_pid(jmr, target_pid, true); + if (!jobmgr_assumes(jmr, j_for_service != NULL)) { kr = BOOTSTRAP_NO_MEMORY; goto out; } - if ((ms = machservice_new(j_for_service, l2l_names[l2l_i], &l2l_ports[l2l_i], false))) { + if ((ms = machservice_new(j_for_service, serv_name, &l2l_ports[l2l_i], serv_perpid))) { machservice_request_notifications(ms); } } @@ -5345,15 +5364,13 @@ kr = 0; out: - if (l2l_names) { - mig_deallocate((vm_address_t)l2l_names, l2l_name_cnt * sizeof(l2l_names[0])); + if (out_obj_array) { + launch_data_free(out_obj_array); } + if (l2l_ports) { mig_deallocate((vm_address_t)l2l_ports, l2l_port_cnt * sizeof(l2l_ports[0])); } - if (l2l_pids) { - mig_deallocate((vm_address_t)l2l_pids, l2l_pid_cnt * sizeof(l2l_pids[0])); - } if (kr == 0) { if (target_subset) { @@ -5368,14 +5385,13 @@ kern_return_t job_mig_take_subset(job_t j, mach_port_t *reqport, mach_port_t *rcvright, - name_array_t *servicenamesp, unsigned int *servicenames_cnt, - pid_array_t *pidsp, unsigned int *pids_cnt, + vm_offset_t *outdata, mach_msg_type_number_t *outdataCnt, mach_port_array_t *portsp, unsigned int *ports_cnt) { - name_array_t service_names = NULL; + launch_data_t tmp_obj, tmp_dict, outdata_obj_array = NULL; mach_port_array_t ports = NULL; - pid_array_t pids = NULL; unsigned int cnt = 0, cnt2 = 0; + size_t packed_size; struct machservice *ms; jobmgr_t jm; job_t ji; @@ -5399,6 +5415,17 @@ job_log(j, LOG_DEBUG, "Transferring sub-bootstrap to the per session launchd."); + outdata_obj_array = launch_data_alloc(LAUNCH_DATA_ARRAY); + if (!job_assumes(j, outdata_obj_array)) { + goto out_bad; + } + + *outdataCnt = 20 * 1024 * 1024; + mig_allocate(outdata, *outdataCnt); + if (!job_assumes(j, *outdata != 0)) { + return 1; + } + LIST_FOREACH(ji, &j->mgr->jobs, sle) { if (!ji->anonymous) { continue; @@ -5408,29 +5435,43 @@ } } - mig_allocate((vm_address_t *)&service_names, cnt * sizeof(service_names[0])); - if (!launchd_assumes(service_names != NULL)) { - goto out_bad; - } - mig_allocate((vm_address_t *)&ports, cnt * sizeof(ports[0])); if (!launchd_assumes(ports != NULL)) { goto out_bad; } - mig_allocate((vm_address_t *)&pids, cnt * sizeof(pids[0])); - if (!launchd_assumes(pids != NULL)) { - goto out_bad; - } - LIST_FOREACH(ji, &j->mgr->jobs, sle) { if (!ji->anonymous) { continue; } + SLIST_FOREACH(ms, &ji->machservices, sle) { - strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0])); + if (job_assumes(j, (tmp_dict = launch_data_alloc(LAUNCH_DATA_DICTIONARY)))) { + job_assumes(j, launch_data_array_set_index(outdata_obj_array, tmp_dict, cnt2)); + } else { + goto out_bad; + } + + if (job_assumes(j, (tmp_obj = launch_data_new_string(machservice_name(ms))))) { + job_assumes(j, launch_data_dict_insert(tmp_dict, tmp_obj, TAKE_SUBSET_NAME)); + } else { + goto out_bad; + } + + if (job_assumes(j, (tmp_obj = launch_data_new_integer((ms->job->p))))) { + job_assumes(j, launch_data_dict_insert(tmp_dict, tmp_obj, TAKE_SUBSET_PID)); + } else { + goto out_bad; + } + + if (job_assumes(j, (tmp_obj = launch_data_new_bool((ms->per_pid))))) { + job_assumes(j, launch_data_dict_insert(tmp_dict, tmp_obj, TAKE_SUBSET_PERPID)); + } else { + goto out_bad; + } + ports[cnt2] = machservice_port(ms); - pids[cnt2] = ms->job->p; + /* Increment the send right by one so we can shutdown the jobmgr cleanly */ jobmgr_assumes(jm, (errno = mach_port_mod_refs(mach_task_self(), ports[cnt2], MACH_PORT_RIGHT_SEND, 1)) == 0); cnt2++; @@ -5439,10 +5480,15 @@ launchd_assumes(cnt == cnt2); - *servicenamesp = service_names; + packed_size = launch_data_pack(outdata_obj_array, (void *)*outdata, *outdataCnt, NULL, NULL); + if (!job_assumes(j, packed_size != 0)) { + goto out_bad; + } + + launch_data_free(outdata_obj_array); + *portsp = ports; - *pidsp = pids; - *servicenames_cnt = *ports_cnt = *pids_cnt = cnt; + *ports_cnt = cnt; *reqport = jm->req_port; *rcvright = jm->jm_port; @@ -5455,11 +5501,11 @@ return BOOTSTRAP_SUCCESS; out_bad: - if (service_names) { - mig_deallocate((vm_address_t)service_names, cnt * sizeof(service_names[0])); + if (outdata_obj_array) { + launch_data_free(outdata_obj_array); } - if (pids) { - mig_deallocate((vm_address_t)pids, cnt * sizeof(pids[0])); + if (*outdata) { + mig_deallocate(*outdata, *outdataCnt); } if (ports) { mig_deallocate((vm_address_t)ports, cnt * sizeof(ports[0])); Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2007-05-22 20:22:10 UTC (rev 23261) +++ trunk/launchd/src/libvproc.c 2007-05-24 20:54:11 UTC (rev 23262) @@ -45,12 +45,31 @@ static int64_t cached_pid = -1; kern_return_t -_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, - name_array_t *service_names, mach_msg_type_number_t *service_namesCnt, - pid_array_t *pids, mach_msg_type_number_t *pidCnt, +_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, launch_data_t *outval, mach_port_array_t *ports, mach_msg_type_number_t *portCnt) { - return vproc_mig_take_subset(bp, reqport, rcvright, service_names, service_namesCnt, pids, pidCnt, ports, portCnt); + mach_msg_type_number_t outdata_cnt; + vm_offset_t outdata = 0; + size_t data_offset = 0; + launch_data_t out_obj; + kern_return_t kr; + + if ((kr = vproc_mig_take_subset(bp, reqport, rcvright, &outdata, &outdata_cnt, ports, portCnt))) { + goto out; + } + + if ((out_obj = launch_data_unpack((void *)outdata, outdata_cnt, NULL, 0, &data_offset, NULL))) { + *outval = launch_data_copy(out_obj); + } else { + kr = 1; + } + +out: + if (outdata) { + mig_deallocate(outdata, outdata_cnt); + } + + return kr; } vproc_err_t Modified: trunk/launchd/src/libvproc_internal.h =================================================================== --- trunk/launchd/src/libvproc_internal.h 2007-05-22 20:22:10 UTC (rev 23261) +++ trunk/launchd/src/libvproc_internal.h 2007-05-24 20:54:11 UTC (rev 23262) @@ -22,6 +22,7 @@ #include #include +#include "liblaunch_public.h" #include "libbootstrap_public.h" typedef char * _internal_string_t; @@ -48,9 +49,7 @@ #define SPAWN_WANTS_WAIT4DEBUGGER 0x0008 kern_return_t -_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, - name_array_t *service_names, mach_msg_type_number_t *service_namesCnt, - pid_array_t *pids, mach_msg_type_number_t *pidCnt, +_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, launch_data_t *outval, mach_port_array_t *ports, mach_msg_type_number_t *portCnt); kern_return_t _vprocmgr_getsocket(name_t); Modified: trunk/launchd/src/protocol_job.defs =================================================================== --- trunk/launchd/src/protocol_job.defs 2007-05-22 20:22:10 UTC (rev 23261) +++ trunk/launchd/src/protocol_job.defs 2007-05-24 20:54:11 UTC (rev 23262) @@ -100,8 +100,7 @@ __bs_port : job_t; out __bs_reqport : mach_port_move_send_t; out __bs_rcvright : mach_port_move_receive_t; - out __service_names : name_array_t, dealloc; - out __service_pids : pid_array_t, dealloc; + out __outdata : pointer_t, dealloc; out __service_ports : mach_port_move_send_array_t, dealloc); routine getsocket( -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070524/df1da397/attachment.html From source_changes at macosforge.org Thu May 24 13:54:20 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23263] tags/launchd-218/ Message-ID: <20070524205420.11EB861D324@cvs.opensource.apple.com> Revision: 23263 http://trac.macosforge.org/projects/launchd/changeset/23263 Author: zarzycki@apple.com Date: 2007-05-24 13:54:19 -0700 (Thu, 24 May 2007) Log Message: ----------- "Tagging launchd-218 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-218/ Copied: tags/launchd-218 (from rev 23262, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070524/8d65eb1d/attachment.html From source_changes at macosforge.org Fri May 25 13:44:01 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23264] trunk/launchd/src Message-ID: <20070525204401.B39D86208CF@cvs.opensource.apple.com> Revision: 23264 http://trac.macosforge.org/projects/launchd/changeset/23264 Author: zarzycki@apple.com Date: 2007-05-25 13:44:01 -0700 (Fri, 25 May 2007) Log Message: ----------- spawn_via_launchd: specify quarantine and seatbelt information Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_mig_types.defs trunk/launchd/src/liblaunch_private.h trunk/launchd/src/libvproc.c trunk/launchd/src/libvproc_internal.h trunk/launchd/src/protocol_job.defs Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-24 20:54:19 UTC (rev 23263) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-25 20:44:01 UTC (rev 23264) @@ -72,6 +72,7 @@ #include #include #include +#include #include "liblaunch_public.h" #include "liblaunch_private.h" @@ -194,6 +195,7 @@ static bool limititem_update(job_t j, int w, rlim_t r); static void limititem_delete(job_t j, struct limititem *li); static void limititem_setup(launch_data_t obj, const char *key, void *context); +static void seatbelt_setup_flags(launch_data_t obj, const char *key, void *context); typedef enum { NETWORK_UP = 1, @@ -297,7 +299,7 @@ #if DO_RUSAGE_SUMMATION struct rusage ru; #endif - binpref_t j_binpref; + cpu_type_t *j_binpref; size_t j_binpref_cnt; mach_port_t j_port; mach_port_t wait_reply_port; @@ -313,6 +315,10 @@ char *stderrpath; struct machservice *lastlookup; unsigned int lastlookup_gennum; + char *seatbelt_profile; + uint64_t seatbelt_flags; + void *quarantine_data; + size_t quarantine_data_sz; pid_t p; int argc; int last_exit_status; @@ -354,6 +360,7 @@ static void job_import_integer(job_t j, const char *key, long long value); static void job_import_dictionary(job_t j, const char *key, launch_data_t value); static void job_import_array(job_t j, const char *key, launch_data_t value); +static void job_import_opaque(job_t j, const char *key, launch_data_t value); static bool job_set_global_on_demand(job_t j, bool val); static void job_watch(job_t j); static void job_ignore(job_t j); @@ -376,7 +383,6 @@ static void job_callback_read(job_t j, int ident); static job_t job_new_anonymous(jobmgr_t jm, pid_t anonpid); static job_t job_new(jobmgr_t jm, const char *label, const char *prog, const char *const *argv); -static job_t job_new_spawn(job_t j, const char *label, const char *path, const char *workingdir, const char *const *argv, const char *const *env, mode_t *u_mask, bool w4d); static job_t job_new_via_mach_init(job_t j, const char *cmd, uid_t uid, bool ond); static const char *job_prog(job_t j); static pid_t job_get_pid(job_t j); @@ -773,6 +779,12 @@ if (j->stderrpath) { free(j->stderrpath); } + if (j->seatbelt_profile) { + free(j->seatbelt_profile); + } + if (j->quarantine_data) { + free(j->quarantine_data); + } if (j->start_interval) { job_assumes(j, kevent_mod((uintptr_t)&j->start_interval, EVFILT_TIMER, EV_DELETE, 0, 0, NULL) != -1); } @@ -921,64 +933,6 @@ return 0; } -job_t -job_new_spawn(job_t j, const char *label, const char *path, const char *workingdir, const char *const *argv, const char *const *env, mode_t *u_mask, bool w4d) -{ - job_t jr; - size_t i; - - if ((jr = job_find(label)) != NULL) { - errno = EEXIST; - return NULL; - } - - jr = job_new(j->mgr, label, path, argv); - - if (!jr) { - return NULL; - } - - job_reparent_hack(jr, NULL); - - if (getpid() == 1) { - struct ldcred ldc; - - runtime_get_caller_creds(&ldc); - jr->mach_uid = ldc.uid; - } - - jr->unload_at_exit = true; - jr->wait4pipe_eof = true; - jr->stall_before_exec = w4d; - - if (workingdir) { - jr->workingdir = strdup(workingdir); - } - - if (u_mask) { - jr->mask = *u_mask; - jr->setmask = true; - } - - if (env) for (i = 0; env[i]; i++) { - char *eqoff, tmpstr[strlen(env[i]) + 1]; - - strcpy(tmpstr, env[i]); - - eqoff = strchr(tmpstr, '='); - - if (!eqoff) { - job_log(jr, LOG_WARNING, "Environmental variable missing '=' separator: %s", tmpstr); - continue; - } - - *eqoff = '\0'; - envitem_new(jr, tmpstr, eqoff + 1, false); - } - - return jr; -} - job_t job_new_anonymous(jobmgr_t jm, pid_t anonpid) { @@ -1357,6 +1311,8 @@ where2put = &j->stdoutpath; } else if (strcasecmp(key, LAUNCH_JOBKEY_STANDARDERRORPATH) == 0) { where2put = &j->stderrpath; + } else if (strcasecmp(key, LAUNCH_JOBKEY_SANDBOXPROFILE) == 0) { + where2put = &j->seatbelt_profile; } break; default: @@ -1426,7 +1382,10 @@ if (-1 == kevent_mod((uintptr_t)&j->start_interval, EVFILT_TIMER, EV_ADD, NOTE_SECONDS, value, j)) { job_log_error(j, LOG_ERR, "adding kevent timer"); } + } else if (strcasecmp(key, LAUNCH_JOBKEY_SANDBOXFLAGS) == 0) { + j->seatbelt_flags = value; } + break; default: job_log(j, LOG_WARNING, "Unknown key for integer: %s", key); @@ -1435,6 +1394,26 @@ } void +job_import_opaque(job_t j, const char *key, launch_data_t value) +{ + switch (key[0]) { + case 'q': + case 'Q': + if (strcasecmp(key, LAUNCH_JOBKEY_QUARANTINEDATA) == 0) { + size_t tmpsz = launch_data_get_opaque_size(value); + + if (job_assumes(j, j->quarantine_data = malloc(tmpsz))) { + memcpy(j->quarantine_data, launch_data_get_opaque(value), tmpsz); + j->quarantine_data_sz = tmpsz; + } + } + break; + default: + break; + } +} + +void job_import_dictionary(job_t j, const char *key, launch_data_t value) { launch_data_t tmp; @@ -1477,6 +1456,8 @@ calendarinterval_new_from_obj(j, value); } else if (strcasecmp(key, LAUNCH_JOBKEY_SOFTRESOURCELIMITS) == 0) { launch_data_dict_iterate(value, limititem_setup, j); + } else if (strcasecmp(key, LAUNCH_JOBKEY_SANDBOXFLAGS) == 0) { + launch_data_dict_iterate(value, seatbelt_setup_flags, j); } break; case 'h': @@ -1552,6 +1533,13 @@ case 'B': if (strcasecmp(key, LAUNCH_JOBKEY_BONJOURFDS) == 0) { socketgroup_setup(value, LAUNCH_JOBKEY_BONJOURFDS, j); + } else if (strcasecmp(key, LAUNCH_JOBKEY_BINARYORDERPREFERENCE) == 0) { + if (job_assumes(j, j->j_binpref = malloc(value_cnt * sizeof(*j->j_binpref)))) { + j->j_binpref_cnt = value_cnt; + for (i = 0; i < value_cnt; i++) { + j->j_binpref[i] = launch_data_get_integer(launch_data_array_get_index(value, i)); + } + } } break; case 's': @@ -1596,6 +1584,9 @@ case LAUNCH_DATA_ARRAY: job_import_array(j, key, obj); break; + case LAUNCH_DATA_OPAQUE: + job_import_opaque(j, key, obj); + break; default: job_log(j, LOG_WARNING, "Unknown value type '%d' for key: %s", kind, key); break; @@ -2374,6 +2365,27 @@ signal(i, SIG_DFL); } + if (j->quarantine_data) { + qtn_proc_t qp; + + if (job_assumes(j, qp = qtn_proc_alloc())) { + if (job_assumes(j, qtn_proc_init_with_data(qp, j->quarantine_data, j->quarantine_data_sz) == 0)) { + job_assumes(j, qtn_proc_apply_to_self(qp) == 0); + } + } + } + + if (j->seatbelt_profile) { + char *seatbelt_err_buf = NULL; + + if (!job_assumes(j, sandbox_init(j->seatbelt_profile, j->seatbelt_flags, &seatbelt_err_buf) != -1)) { + if (seatbelt_err_buf) { + job_log(j, LOG_ERR, "Sandbox failed to init: %s", seatbelt_err_buf); + } + goto out_bad; + } + } + if (j->prog) { errno = posix_spawn(&junk_pid, j->inetcompat ? file2exec : j->prog, NULL, &spattr, (char *const*)argv, environ); job_log_error(j, LOG_ERR, "posix_spawn(\"%s\", ...)", j->prog); @@ -2382,6 +2394,7 @@ job_log_error(j, LOG_ERR, "posix_spawnp(\"%s\", ...)", argv[0]); } +out_bad: _exit(EXIT_FAILURE); } @@ -3231,6 +3244,25 @@ } void +seatbelt_setup_flags(launch_data_t obj, const char *key, void *context) +{ + job_t j = context; + + if (launch_data_get_type(obj) != LAUNCH_DATA_BOOL) { + job_log(j, LOG_WARNING, "Sandbox flag value must be boolean: %s", key); + return; + } + + if (launch_data_get_bool(obj) == false) { + return; + } + + if (strcasecmp(key, LAUNCH_JOBKEY_SANDBOX_NAMED) == 0) { + j->seatbelt_flags |= SANDBOX_NAMED; + } +} + +void limititem_setup(launch_data_t obj, const char *key, void *context) { job_t j = context; @@ -5320,8 +5352,6 @@ kr = _vproc_grab_subset(target_subset, &reqport, &rcvright, &out_obj_array, &l2l_ports, &l2l_port_cnt); - job_log(j, LOG_NOTICE, "@@@@@ kr == 0x%x", kr); - if (!job_assumes(j, kr == 0)) { goto out; } @@ -5343,11 +5373,11 @@ job_assumes(j, obj_at_idx = launch_data_array_get_index(out_obj_array, l2l_i)); job_assumes(j, tmp = launch_data_dict_lookup(obj_at_idx, TAKE_SUBSET_PID)); - job_assumes(j, target_pid = launch_data_get_integer(tmp)); + target_pid = launch_data_get_integer(tmp); job_assumes(j, tmp = launch_data_dict_lookup(obj_at_idx, TAKE_SUBSET_PERPID)); - job_assumes(j, serv_perpid = launch_data_get_bool(tmp)); + serv_perpid = launch_data_get_bool(tmp); job_assumes(j, tmp = launch_data_dict_lookup(obj_at_idx, TAKE_SUBSET_NAME)); - job_assumes(j, serv_name = launch_data_get_string(tmp)); + serv_name = launch_data_get_string(tmp); j_for_service = jobmgr_find_by_pid(jmr, target_pid, true); @@ -5647,19 +5677,12 @@ } kern_return_t -job_mig_spawn(job_t j, _internal_string_t charbuf, mach_msg_type_number_t charbuf_cnt, - uint32_t argc, uint32_t envc, uint64_t flags, uint16_t mig_umask, - binpref_t bin_pref, uint32_t binpref_cnt, pid_t *child_pid, mach_port_t *obsvr_port) +job_mig_spawn(job_t j, vm_offset_t indata, mach_msg_type_number_t indataCnt, pid_t *child_pid, mach_port_t *obsvr_port) { + launch_data_t input_obj = NULL; + size_t data_offset = 0; + struct ldcred ldc; job_t jr; - size_t offset = 0; - char *tmpp; - const char **argv = NULL, **env = NULL; - const char *label = NULL; - const char *path = NULL; - const char *workingdir = NULL; - size_t argv_i = 0, env_i = 0; - struct ldcred ldc; runtime_get_caller_creds(&ldc); @@ -5672,38 +5695,15 @@ return VPROC_ERR_TRY_PER_USER; } - argv = alloca((argc + 1) * sizeof(char *)); - memset(argv, 0, (argc + 1) * sizeof(char *)); - - if (envc > 0) { - env = alloca((envc + 1) * sizeof(char *)); - memset(env, 0, (envc + 1) * sizeof(char *)); + if (indataCnt == 0) { + return 1; } - while (offset < charbuf_cnt) { - tmpp = charbuf + offset; - offset += strlen(tmpp) + 1; - if (!label) { - label = tmpp; - } else if (argc > 0) { - argv[argv_i] = tmpp; - argv_i++; - argc--; - } else if (envc > 0) { - env[env_i] = tmpp; - env_i++; - envc--; - } else if (flags & SPAWN_HAS_PATH) { - path = tmpp; - flags &= ~SPAWN_HAS_PATH; - } else if (flags & SPAWN_HAS_WDIR) { - workingdir = tmpp; - flags &= ~SPAWN_HAS_WDIR; - } + if (!job_assumes(j, (input_obj = launch_data_unpack((void *)indata, indataCnt, NULL, 0, &data_offset, NULL)) != NULL)) { + return 1; } - jr = job_new_spawn(j, label, path, workingdir, argv, env, flags & SPAWN_HAS_UMASK ? &mig_umask : NULL, - flags & SPAWN_WANTS_WAIT4DEBUGGER); + jr = job_import2(input_obj); if (jr == NULL) switch (errno) { case EEXIST: @@ -5712,9 +5712,17 @@ return BOOTSTRAP_NO_MEMORY; } - memcpy(jr->j_binpref, bin_pref, sizeof(jr->j_binpref)); - jr->j_binpref_cnt = binpref_cnt; + job_reparent_hack(jr, NULL); + if (getpid() == 1) { + jr->mach_uid = ldc.uid; + } + + jr->unload_at_exit = true; + jr->wait4pipe_eof = true; + jr->stall_before_exec = jr->wait4debugger; + jr->wait4debugger = false; + jr = job_dispatch(jr, true); if (!job_assumes(j, jr != NULL)) { @@ -5726,12 +5734,12 @@ return BOOTSTRAP_NO_MEMORY; } - job_log(j, LOG_INFO, "Spawned with flags:%s", flags & SPAWN_WANTS_WAIT4DEBUGGER ? " stopped": ""); + job_log(j, LOG_INFO, "Spawned"); *child_pid = job_get_pid(jr); *obsvr_port = jr->j_port; - mig_deallocate((vm_address_t)charbuf, charbuf_cnt); + mig_deallocate(indata, indataCnt); return BOOTSTRAP_SUCCESS; } Modified: trunk/launchd/src/launchd_mig_types.defs =================================================================== --- trunk/launchd/src/launchd_mig_types.defs 2007-05-24 20:54:19 UTC (rev 23263) +++ trunk/launchd/src/launchd_mig_types.defs 2007-05-25 20:44:01 UTC (rev 23264) @@ -30,13 +30,10 @@ type vproc_gsk_t = integer_t; type logmsg_t = c_string[*:2048]; type cmd_t = c_string[512]; -type cmd_array_t = ^array [] of cmd_t; type name_t = c_string[128]; type name_array_t = ^array [] of name_t; -type _internal_string_t = ^array [] of char; type bootstrap_status_t = integer_t; type bootstrap_status_array_t = ^array [] of bootstrap_status_t; -type binpref_t = array [8] of integer_t; type job_t = mach_port_t intran: job_t job_mig_intran(mach_port_t) Modified: trunk/launchd/src/liblaunch_private.h =================================================================== --- trunk/launchd/src/liblaunch_private.h 2007-05-24 20:54:19 UTC (rev 23263) +++ trunk/launchd/src/liblaunch_private.h 2007-05-25 20:44:01 UTC (rev 23264) @@ -24,6 +24,7 @@ #include #include #include +#include #pragma GCC visibility push(default) @@ -45,9 +46,15 @@ #define LAUNCH_KEY_BATCHCONTROL "BatchControl" #define LAUNCH_KEY_BATCHQUERY "BatchQuery" +#define LAUNCH_JOBKEY_QUARANTINEDATA "QuarantineData" +#define LAUNCH_JOBKEY_SANDBOXPROFILE "SandboxProfile" +#define LAUNCH_JOBKEY_SANDBOXFLAGS "SandboxFlags" +#define LAUNCH_JOBKEY_SANDBOX_NAMED "Named" + #define LAUNCH_JOBKEY_ENTERKERNELDEBUGGERBEFOREKILL "EnterKernelDebuggerBeforeKill" #define LAUNCH_JOBKEY_PERJOBMACHSERVICES "PerJobMachServices" #define LAUNCH_JOBKEY_SERVICEIPC "ServiceIPC" +#define LAUNCH_JOBKEY_BINARYORDERPREFERENCE "BinaryOrderPreference" #define LAUNCH_JOBKEY_MACH_KUNCSERVER "kUNCServer" #define LAUNCH_JOBKEY_MACH_EXCEPTIONSERVER "ExceptionServer" @@ -106,9 +113,12 @@ mach_port_t * spawn_observer_port; const cpu_type_t * spawn_binpref; size_t spawn_binpref_cnt; + const qtn_proc_t spawn_quarantine; + const char * spawn_seatbelt_profile; + const uint64_t * spawn_seatbelt_flags; }; -#define spawn_via_launchd(a, b, c) _spawn_via_launchd(a, b, c, 1) +#define spawn_via_launchd(a, b, c) _spawn_via_launchd(a, b, c, 2) pid_t _spawn_via_launchd( const char *label, const char *const *argv, Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2007-05-24 20:54:19 UTC (rev 23263) +++ trunk/launchd/src/libvproc.c 2007-05-25 20:44:01 UTC (rev 23264) @@ -172,75 +172,115 @@ pid_t _spawn_via_launchd(const char *label, const char *const *argv, const struct spawn_via_launchd_attr *spawn_attrs, int struct_version) { - kern_return_t kr; + size_t i, good_enough_size = 10*1024*1024; + mach_msg_type_number_t indata_cnt = 0; + vm_offset_t indata = 0; + mach_port_t obsvr_port = MACH_PORT_NULL; + launch_data_t tmp, tmp_array, in_obj; const char *const *tmpp; - size_t len, buf_len = strlen(label) + 1; - char *buf = strdup(label); - uint64_t flags = 0; - uint32_t argc = 0; - uint32_t envc = 0; - binpref_t bin_pref; - size_t binpref_cnt = 0, binpref_max = sizeof(bin_pref) / sizeof(bin_pref[0]); + kern_return_t kr = 1; + void *buf = NULL; pid_t p = -1; - mode_t u_mask = CMASK; - mach_port_t obsvr_port = MACH_PORT_NULL; - memset(&bin_pref, 0, sizeof(bin_pref)); + if ((in_obj = launch_data_alloc(LAUNCH_DATA_DICTIONARY)) == NULL) { + goto out; + } - for (tmpp = argv; *tmpp; tmpp++) { - argc++; - len = strlen(*tmpp) + 1; - buf = reallocf(buf, buf_len + len); - strcpy(buf + buf_len, *tmpp); - buf_len += len; + if ((tmp = launch_data_new_string(label)) == NULL) { + goto out; } + launch_data_dict_insert(in_obj, tmp, LAUNCH_JOBKEY_LABEL); + + if ((tmp_array = launch_data_alloc(LAUNCH_DATA_ARRAY)) == NULL) { + goto out; + } + + for (i = 0; *argv; i++, argv++) { + tmp = launch_data_new_string(*argv); + if (tmp == NULL) { + goto out; + } + + launch_data_array_set_index(tmp_array, tmp, i); + } + + launch_data_dict_insert(in_obj, tmp_array, LAUNCH_JOBKEY_PROGRAMARGUMENTS); + if (spawn_attrs) switch (struct_version) { + case 2: + if (spawn_attrs->spawn_quarantine) { + char qbuf[QTN_SERIALIZED_DATA_MAX]; + size_t qbuf_sz = QTN_SERIALIZED_DATA_MAX; + + if (qtn_proc_to_data(spawn_attrs->spawn_quarantine, qbuf, &qbuf_sz) == 0) { + tmp = launch_data_new_opaque(qbuf, qbuf_sz); + launch_data_dict_insert(in_obj, tmp, LAUNCH_JOBKEY_QUARANTINEDATA); + } + } + + if (spawn_attrs->spawn_seatbelt_profile) { + tmp = launch_data_new_string(spawn_attrs->spawn_seatbelt_profile); + launch_data_dict_insert(in_obj, tmp, LAUNCH_JOBKEY_SANDBOXPROFILE); + } + + if (spawn_attrs->spawn_seatbelt_flags) { + tmp = launch_data_new_integer(*spawn_attrs->spawn_seatbelt_flags); + launch_data_dict_insert(in_obj, tmp, LAUNCH_JOBKEY_SANDBOXFLAGS); + } + + /* fall through */ case 1: if (spawn_attrs->spawn_binpref) { - if (spawn_attrs->spawn_binpref_cnt < binpref_max) { - binpref_max = spawn_attrs->spawn_binpref_cnt; + tmp_array = launch_data_alloc(LAUNCH_DATA_ARRAY); + for (i = 0; i < spawn_attrs->spawn_binpref_cnt; i++) { + tmp = launch_data_new_integer(spawn_attrs->spawn_binpref[i]); + launch_data_array_set_index(tmp_array, tmp, i); } - - for (; binpref_cnt < binpref_max; binpref_cnt++) { - bin_pref[binpref_cnt] = spawn_attrs->spawn_binpref[binpref_cnt]; - } + launch_data_dict_insert(in_obj, tmp_array, LAUNCH_JOBKEY_BINARYORDERPREFERENCE); } - + /* fall through */ case 0: if (spawn_attrs->spawn_flags & SPAWN_VIA_LAUNCHD_STOPPED) { - flags |= SPAWN_WANTS_WAIT4DEBUGGER; + tmp = launch_data_new_bool(true); + launch_data_dict_insert(in_obj, tmp, LAUNCH_JOBKEY_WAITFORDEBUGGER); } if (spawn_attrs->spawn_env) { + launch_data_t tmp_dict = launch_data_alloc(LAUNCH_DATA_DICTIONARY); + for (tmpp = spawn_attrs->spawn_env; *tmpp; tmpp++) { - envc++; - len = strlen(*tmpp) + 1; - buf = reallocf(buf, buf_len + len); - strcpy(buf + buf_len, *tmpp); - buf_len += len; + char *eqoff, tmpstr[strlen(*tmpp) + 1]; + + strcpy(tmpstr, *tmpp); + + eqoff = strchr(tmpstr, '='); + + if (!eqoff) { + goto out; + } + + *eqoff = '\0'; + + launch_data_dict_insert(tmp_dict, launch_data_new_string(eqoff + 1), tmpstr); } + + launch_data_dict_insert(in_obj, tmp_dict, LAUNCH_JOBKEY_ENVIRONMENTVARIABLES); } if (spawn_attrs->spawn_path) { - flags |= SPAWN_HAS_PATH; - len = strlen(spawn_attrs->spawn_path) + 1; - buf = reallocf(buf, buf_len + len); - strcpy(buf + buf_len, spawn_attrs->spawn_path); - buf_len += len; + tmp = launch_data_new_string(spawn_attrs->spawn_path); + launch_data_dict_insert(in_obj, tmp, LAUNCH_JOBKEY_PROGRAM); } if (spawn_attrs->spawn_chdir) { - flags |= SPAWN_HAS_WDIR; - len = strlen(spawn_attrs->spawn_chdir) + 1; - buf = reallocf(buf, buf_len + len); - strcpy(buf + buf_len, spawn_attrs->spawn_chdir); - buf_len += len; + tmp = launch_data_new_string(spawn_attrs->spawn_chdir); + launch_data_dict_insert(in_obj, tmp, LAUNCH_JOBKEY_WORKINGDIRECTORY); } if (spawn_attrs->spawn_umask) { - flags |= SPAWN_HAS_UMASK; - u_mask = *spawn_attrs->spawn_umask; + tmp = launch_data_new_integer(*spawn_attrs->spawn_umask); + launch_data_dict_insert(in_obj, tmp, LAUNCH_JOBKEY_UMASK); } break; @@ -248,29 +288,44 @@ break; } - kr = vproc_mig_spawn(bootstrap_port, buf, buf_len, argc, envc, flags, u_mask, bin_pref, binpref_cnt, &p, &obsvr_port); + if (!(buf = malloc(good_enough_size))) { + goto out; + } + if ((indata_cnt = launch_data_pack(in_obj, buf, good_enough_size, NULL, NULL)) == 0) { + goto out; + } + + indata = (vm_offset_t)buf; + + kr = vproc_mig_spawn(bootstrap_port, indata, indata_cnt, &p, &obsvr_port); + if (kr == VPROC_ERR_TRY_PER_USER) { mach_port_t puc; if (vproc_mig_lookup_per_user_context(bootstrap_port, 0, &puc) == 0) { - kr = vproc_mig_spawn(puc, buf, buf_len, argc, envc, flags, u_mask, bin_pref, binpref_cnt, &p, &obsvr_port); + kr = vproc_mig_spawn(puc, indata, indata_cnt, &p, &obsvr_port); mach_port_deallocate(mach_task_self(), puc); } } - free(buf); +out: + if (in_obj) { + launch_data_free(in_obj); + } - if (kr == BOOTSTRAP_SUCCESS) { + if (buf) { + free(buf); + } + + switch (kr) { + case BOOTSTRAP_SUCCESS: if (spawn_attrs && spawn_attrs->spawn_observer_port) { *spawn_attrs->spawn_observer_port = obsvr_port; } else { mach_port_deallocate(mach_task_self(), obsvr_port); } return p; - } - - switch (kr) { case BOOTSTRAP_NOT_PRIVILEGED: errno = EPERM; break; case BOOTSTRAP_NO_MEMORY: @@ -278,6 +333,7 @@ default: errno = EINVAL; break; } + return -1; } Modified: trunk/launchd/src/libvproc_internal.h =================================================================== --- trunk/launchd/src/libvproc_internal.h 2007-05-24 20:54:19 UTC (rev 23263) +++ trunk/launchd/src/libvproc_internal.h 2007-05-25 20:44:01 UTC (rev 23264) @@ -29,7 +29,6 @@ typedef char * logmsg_t; typedef pid_t * pid_array_t; typedef mach_port_t vproc_mig_t; -typedef integer_t binpref_t[8]; #ifdef protocol_vproc_MSG_COUNT /* HACK */ Modified: trunk/launchd/src/protocol_job.defs =================================================================== --- trunk/launchd/src/protocol_job.defs 2007-05-24 20:54:19 UTC (rev 23263) +++ trunk/launchd/src/protocol_job.defs 2007-05-25 20:44:01 UTC (rev 23264) @@ -109,13 +109,7 @@ routine spawn( __bs_port : job_t; - __chars : _internal_string_t; - __argc : uint32_t; - __envc : uint32_t; - __flags : uint64_t; - __umask : uint16_t; - __binpref : binpref_t; - __binpref_cnt : uint32_t; + __indata : pointer_t; out __pid : pid_t; out __obsvr_port : mach_port_make_send_t); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070525/6d26629f/attachment.html From source_changes at macosforge.org Fri May 25 13:44:07 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23265] tags/launchd-219/ Message-ID: <20070525204407.14BA36208D3@cvs.opensource.apple.com> Revision: 23265 http://trac.macosforge.org/projects/launchd/changeset/23265 Author: zarzycki@apple.com Date: 2007-05-25 13:44:06 -0700 (Fri, 25 May 2007) Log Message: ----------- "Tagging launchd-219 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-219/ Copied: tags/launchd-219 (from rev 23264, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070525/b55e8bc1/attachment.html From source_changes at macosforge.org Tue May 29 12:28:48 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23266] trunk/launchd/src/liblaunch_private.h Message-ID: <20070529192848.6C734626AB8@cvs.opensource.apple.com> Revision: 23266 http://trac.macosforge.org/projects/launchd/changeset/23266 Author: zarzycki@apple.com Date: 2007-05-29 12:28:47 -0700 (Tue, 29 May 2007) Log Message: ----------- Drop some inaccurate 'const' use. Modified Paths: -------------- trunk/launchd/src/liblaunch_private.h Modified: trunk/launchd/src/liblaunch_private.h =================================================================== --- trunk/launchd/src/liblaunch_private.h 2007-05-25 20:44:06 UTC (rev 23265) +++ trunk/launchd/src/liblaunch_private.h 2007-05-29 19:28:47 UTC (rev 23266) @@ -113,7 +113,7 @@ mach_port_t * spawn_observer_port; const cpu_type_t * spawn_binpref; size_t spawn_binpref_cnt; - const qtn_proc_t spawn_quarantine; + qtn_proc_t spawn_quarantine; const char * spawn_seatbelt_profile; const uint64_t * spawn_seatbelt_flags; }; -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070529/0c11c9a4/attachment.html From source_changes at macosforge.org Tue May 29 12:28:58 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23267] tags/launchd-219.1/ Message-ID: <20070529192858.0B0AC626AC2@cvs.opensource.apple.com> Revision: 23267 http://trac.macosforge.org/projects/launchd/changeset/23267 Author: zarzycki@apple.com Date: 2007-05-29 12:28:57 -0700 (Tue, 29 May 2007) Log Message: ----------- "Tagging launchd-219.1 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-219.1/ Copied: tags/launchd-219.1 (from rev 23266, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070529/d0dc6ff6/attachment.html From source_changes at macosforge.org Wed May 30 17:43:01 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23268] trunk/launchd/src/liblaunch.c Message-ID: <20070531004301.5943B62962C@cvs.opensource.apple.com> Revision: 23268 http://trac.macosforge.org/projects/launchd/changeset/23268 Author: zarzycki@apple.com Date: 2007-05-30 17:43:01 -0700 (Wed, 30 May 2007) Log Message: ----------- WWDC: can't use Entourage on Mac Pro/9A457 Modified Paths: -------------- trunk/launchd/src/liblaunch.c Modified: trunk/launchd/src/liblaunch.c =================================================================== --- trunk/launchd/src/liblaunch.c 2007-05-29 19:28:57 UTC (rev 23267) +++ trunk/launchd/src/liblaunch.c 2007-05-31 00:43:01 UTC (rev 23268) @@ -123,7 +123,7 @@ mach_port_t mp; int err; long long number; - bool boolean; + uint32_t boolean; /* We'd use 'bool' but this struct needs to be used under Rosetta, and sizeof(bool) is different between PowerPC and Intel */ double float_num; }; }; -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070530/56c74df8/attachment.html From source_changes at macosforge.org Thu May 31 11:36:32 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23269] trunk/launchd/src/launchd_core_logic.c Message-ID: <20070531183632.CB71C62A349@cvs.opensource.apple.com> Revision: 23269 http://trac.macosforge.org/projects/launchd/changeset/23269 Author: zarzycki@apple.com Date: 2007-05-31 11:36:32 -0700 (Thu, 31 May 2007) Log Message: ----------- Auto login after the initial setup is broken. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-05-31 00:43:01 UTC (rev 23268) +++ trunk/launchd/src/launchd_core_logic.c 2007-05-31 18:36:32 UTC (rev 23269) @@ -260,6 +260,7 @@ (__builtin_expect(!(e), 0) ? jobmgr_log_bug(jm, __rcs_file_version__, __FILE__, __LINE__, #e), false : true) static jobmgr_t jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag, const char *name); +static job_t jobmgr_import2(jobmgr_t jm, launch_data_t pload); static jobmgr_t jobmgr_parent(jobmgr_t jm); static jobmgr_t jobmgr_do_garbage_collection(jobmgr_t jm); static void jobmgr_reap_bulk(jobmgr_t jm, struct kevent *kev); @@ -353,7 +354,6 @@ #define job_assumes(j, e) \ (__builtin_expect(!(e), 0) ? job_log_bug(j, __rcs_file_version__, __FILE__, __LINE__, #e), false : true) -static job_t job_import2(launch_data_t pload); static void job_import_keys(launch_data_t obj, const char *key, void *context); static void job_import_bool(job_t j, const char *key, bool value); static void job_import_string(job_t j, const char *key, const char *value); @@ -1098,7 +1098,7 @@ job_t job_import(launch_data_t pload) { - job_t j = job_import2(pload); + job_t j = jobmgr_import2(root_jobmgr, pload); if (j == NULL) { return NULL; @@ -1117,7 +1117,7 @@ ja = alloca(c * sizeof(job_t )); for (i = 0; i < c; i++) { - if ((ja[i] = job_import2(launch_data_array_get_index(pload, i)))) { + if ((ja[i] = jobmgr_import2(root_jobmgr, launch_data_array_get_index(pload, i)))) { errno = 0; } launch_data_array_set_index(resp, launch_data_new_errno(errno), i); @@ -1594,7 +1594,7 @@ } job_t -job_import2(launch_data_t pload) +jobmgr_import2(jobmgr_t jm, launch_data_t pload) { launch_data_t tmp, ldpa; const char *label = NULL, *prog = NULL; @@ -1654,13 +1654,13 @@ return NULL; } else if (label[0] == '\0' || (strncasecmp(label, "", strlen("com.apple.launchd")) == 0) || (strtol(label, NULL, 10) != 0)) { - jobmgr_log(root_jobmgr, LOG_ERR, "Somebody attempted to use a reserved prefix for a label: %s", label); + jobmgr_log(jm, LOG_ERR, "Somebody attempted to use a reserved prefix for a label: %s", label); /* the empty string, com.apple.launchd and number prefixes for labels are reserved */ errno = EINVAL; return NULL; } - if ((j = job_new(root_jobmgr, label, prog, argv))) { + if ((j = job_new(jm, label, prog, argv))) { launch_data_dict_iterate(pload, job_import_keys, j); } @@ -5703,7 +5703,7 @@ return 1; } - jr = job_import2(input_obj); + jr = jobmgr_import2(j->mgr, input_obj); if (jr == NULL) switch (errno) { case EEXIST: -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070531/ae38ad35/attachment.html From source_changes at macosforge.org Thu May 31 13:38:11 2007 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:48 2007 Subject: [launchd-changes] [23270] tags/launchd-220/ Message-ID: <20070531203811.5A03562AA22@cvs.opensource.apple.com> Revision: 23270 http://trac.macosforge.org/projects/launchd/changeset/23270 Author: zarzycki@apple.com Date: 2007-05-31 13:38:11 -0700 (Thu, 31 May 2007) Log Message: ----------- "Tagging launchd-220 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-220/ Copied: tags/launchd-220 (from rev 23269, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070531/509f3f9a/attachment.html