Revision: 22932 http://trac.macosforge.org/projects/launchd/changeset/22932 Author: zarzycki@apple.com Date: 2006-11-02 14:06:55 -0800 (Thu, 02 Nov 2006) Log Message: ----------- Some progress is better than none. Part one of the per-user (not per-session) launchd concept. In this, we kick off an per-user launchd (on demand) whenever a user tries to talk directly to the root bootstrap. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_mig_types.defs trunk/launchd/src/libbootstrap.c trunk/launchd/src/libvproc_internal.h trunk/launchd/src/libvproc_private.h trunk/launchd/src/protocol_job.defs Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-02 22:06:55 UTC (rev 22932) @@ -96,7 +96,7 @@ SLIST_ENTRY(machservice) sle; job_t job; mach_port_name_t port; - unsigned int isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, __junk:27; + unsigned int isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, must_match_uid:1; char name[0]; }; @@ -2761,7 +2761,6 @@ goto out_bad2; } *serviceport = ms->port; - ms->isActive = false; ms->recv = true; } else { ms->port = *serviceport; @@ -3648,6 +3647,71 @@ } kern_return_t +job_mig_lookup_per_user_context(job_t j, uid_t which_user, mach_port_t *up_cont) +{ + struct ldcred ldc; + job_t ji, jbs = root_job; + +#if 0 + jbs = job_get_bs(j); +#endif + + runtime_get_caller_creds(&ldc); + + if (ldc.uid != 0) { + which_user = ldc.uid; + } + + if (which_user == 0) { + return BOOTSTRAP_NOT_PRIVILEGED; + } + + *up_cont = MACH_PORT_NULL; + + SLIST_FOREACH(ji, &jbs->jobs, sle) { + if (ji->mach_uid != which_user) { + continue; + } + if (SLIST_EMPTY(&ji->machservices)) { + continue; + } + if (!SLIST_FIRST(&ji->machservices)->must_match_uid) { + continue; + } + break; + } + + if (ji == NULL) { + struct machservice *ms; + char lbuf[1024]; + + sprintf(lbuf, "com.apple.launchd.peruser.%u", which_user); + + ji = job_new(jbs, lbuf, "/sbin/launchd", NULL, NULL, 0); + + if (ji == NULL) { + return BOOTSTRAP_NO_MEMORY; + } + + ji->mach_uid = which_user; + + if ((ms = machservice_new(ji, lbuf, up_cont)) == NULL) { + job_remove(ji); + return BOOTSTRAP_NO_MEMORY; + } + + ms->must_match_uid = true; + ms->hide = true; + + job_dispatch(ji, false); + } + + *up_cont = machservice_port(SLIST_FIRST(&ji->machservices)); + + return 0; +} + +kern_return_t job_mig_check_in(job_t j, name_t servicename, mach_port_t *serviceportp) { static pid_t last_warned_pid = 0; @@ -3691,9 +3755,19 @@ runtime_get_caller_creds(&ldc); +#if 0 job_log(j, LOG_NOTICE, "bootstrap_register() is deprecated. PID: %u Service: %s", ldc.pid, servicename); +#endif job_log(j, LOG_DEBUG, "Mach service registration attempt: %s", servicename); + + if (j->anonymous && job_get_bs(j)->parent == NULL && ldc.uid != 0 && ldc.uid != getuid()) { + if (getpid() == 1) { + return VPROC_ERR_TRY_PER_USER; + } else { + return BOOTSTRAP_NOT_PRIVILEGED; + } + } ms = job_lookup_service(j, servicename, false); @@ -3728,10 +3802,16 @@ runtime_get_caller_creds(&ldc); + if (getpid() == 1 && j->anonymous && job_get_bs(j)->parent == NULL && ldc.uid != 0 && ldc.euid != 0) { + return VPROC_ERR_TRY_PER_USER; + } + ms = job_lookup_service(j, servicename, true); if (ms && machservice_hidden(ms) && !job_active(machservice_job(ms))) { ms = NULL; + } else if (ms && ms->must_match_uid) { + ms = NULL; } if (ms) { Modified: trunk/launchd/src/launchd_mig_types.defs =================================================================== --- trunk/launchd/src/launchd_mig_types.defs 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/launchd_mig_types.defs 2006-11-02 22:06:55 UTC (rev 22932) @@ -24,6 +24,8 @@ */ type pid_t = integer_t; +type uid_t = integer_t; +type gid_t = integer_t; type get_set_int_key_t = integer_t; type logmsg_t = c_string[*:2048]; type cmd_t = c_string[512]; Modified: trunk/launchd/src/libbootstrap.c =================================================================== --- trunk/launchd/src/libbootstrap.c 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/libbootstrap.c 2006-11-02 22:06:55 UTC (rev 22932) @@ -21,6 +21,9 @@ #include "config.h" #include "libbootstrap_public.h" +#include "libvproc_public.h" +#include "libvproc_private.h" + #include <mach/mach.h> #include <mach/vm_map.h> @@ -63,7 +66,18 @@ kern_return_t bootstrap_register(mach_port_t bp, name_t service_name, mach_port_t sp) { - return vproc_mig_register(bp, service_name, sp); + kern_return_t kr = vproc_mig_register(bp, service_name, sp); + + if (kr == VPROC_ERR_TRY_PER_USER) { + mach_port_t puc; + + if (vproc_mig_lookup_per_user_context(bp, 0, &puc) == 0) { + kr = vproc_mig_register(puc, service_name, sp); + mach_port_deallocate(mach_task_self(), puc); + } + } + + return kr; } kern_return_t @@ -81,7 +95,21 @@ kern_return_t bootstrap_look_up(mach_port_t bp, name_t service_name, mach_port_t *sp) { - return vproc_mig_look_up(bp, service_name, sp); + kern_return_t kr; + mach_port_t puc; + + if ((kr = vproc_mig_look_up(bp, service_name, sp)) != VPROC_ERR_TRY_PER_USER) { + return kr; + } + + if ((kr = vproc_mig_lookup_per_user_context(bp, 0, &puc)) != 0) { + return kr; + } + + kr = vproc_mig_look_up(puc, service_name, sp); + mach_port_deallocate(mach_task_self(), puc); + + return kr; } kern_return_t Modified: trunk/launchd/src/libvproc_internal.h =================================================================== --- trunk/launchd/src/libvproc_internal.h 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/libvproc_internal.h 2006-11-02 22:06:55 UTC (rev 22932) @@ -37,6 +37,8 @@ #include "launchd_core_logic.h" #endif +#define VPROC_ERR_TRY_PER_USER 1099 + #pragma GCC visibility push(default) #define SPAWN_HAS_PATH 0x0001 Modified: trunk/launchd/src/libvproc_private.h =================================================================== --- trunk/launchd/src/libvproc_private.h 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/libvproc_private.h 2006-11-02 22:06:55 UTC (rev 22932) @@ -21,6 +21,7 @@ */ #include <sys/cdefs.h> +#include <sys/syslog.h> #include <stdbool.h> __BEGIN_DECLS Modified: trunk/launchd/src/protocol_job.defs =================================================================== --- trunk/launchd/src/protocol_job.defs 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/protocol_job.defs 2006-11-02 22:06:55 UTC (rev 22932) @@ -37,7 +37,7 @@ routine create_server( __bs_port : job_t; __server_cmd : cmd_t; - __server_uid : natural_t; + __server_uid : uid_t; __on_demand : boolean_t; out __server_port : mach_port_make_send_t); @@ -125,3 +125,8 @@ __pri : integer_t; __err : integer_t; __msg : logmsg_t); + +routine lookup_per_user_context( + __bs_port : job_t; + __wu : uid_t; + out __u_cont : mach_port_t);
participants (1)
-
source_changes@macosforge.org