Revision: 23443 http://trac.macosforge.org/projects/launchd/changeset/23443 Author: zarzycki@apple.com Date: 2007-10-23 08:40:55 -0700 (Tue, 23 Oct 2007) Log Message: ----------- Short circuit MIG replies when forwarding queries. Modified Paths: -------------- trunk/launchd/src/Makefile.am trunk/launchd/src/Makefile.in trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/protocol_job.defs Added Paths: ----------- trunk/launchd/src/protocol_job_forward.defs Modified: trunk/launchd/src/Makefile.am =================================================================== --- trunk/launchd/src/Makefile.am 2007-10-23 15:29:03 UTC (rev 23442) +++ trunk/launchd/src/Makefile.am 2007-10-23 15:40:55 UTC (rev 23443) @@ -48,13 +48,16 @@ launchd_CFLAGS = -mdynamic-no-pic $(AM_CFLAGS) -Wno-unused-parameter launchd_LDFLAGS = -lbsm -launchd_SOURCES = launchd.c launchd_core_logic.c launchd_unix_ipc.c protocol_vprocServer.c notifyServer.c launchd_internalUser.c launchd_internalServer.c job_replyUser.c launchd_runtime.c launchd_runtime_kill.c +launchd_SOURCES = launchd.c launchd_core_logic.c launchd_unix_ipc.c protocol_vprocServer.c notifyServer.c launchd_internalUser.c launchd_internalServer.c job_replyUser.c launchd_runtime.c launchd_runtime_kill.c job_forwardUser.c launchd_runtime.c:: notifyServer.h launchd_internal.h -launchd_core_logic.c:: protocol_vproc.h job_reply.h protocol_vprocServer.h +launchd_core_logic.c:: protocol_vproc.h job_reply.h protocol_vprocServer.h job_forward.h launchproxy_LDFLAGS = -weak_framework Security +job_forwardUser.c job_forward.h: $(srcdir)/protocol_job_forward.defs + mig $(MIGFLAGS) -sheader /dev/null -server /dev/null $(srcdir)/protocol_job_forward.defs + notifyServer.c notifyServer.h: /usr/include/mach/notify.defs mig $(MIGFLAGS) -header /dev/null -user /dev/null -sheader notifyServer.h /usr/include/mach/notify.defs Modified: trunk/launchd/src/Makefile.in =================================================================== --- trunk/launchd/src/Makefile.in 2007-10-23 15:29:03 UTC (rev 23442) +++ trunk/launchd/src/Makefile.in 2007-10-23 15:40:55 UTC (rev 23443) @@ -96,7 +96,8 @@ am__launchd_SOURCES_DIST = launchd.c launchd_core_logic.c \ launchd_unix_ipc.c protocol_vprocServer.c notifyServer.c \ launchd_internalUser.c launchd_internalServer.c \ - job_replyUser.c launchd_runtime.c launchd_runtime_kill.c + job_replyUser.c launchd_runtime.c launchd_runtime_kill.c \ + job_forwardUser.c @LIBS_ONLY_FALSE@am_launchd_OBJECTS = launchd-launchd.$(OBJEXT) \ @LIBS_ONLY_FALSE@ launchd-launchd_core_logic.$(OBJEXT) \ @LIBS_ONLY_FALSE@ launchd-launchd_unix_ipc.$(OBJEXT) \ @@ -106,7 +107,8 @@ @LIBS_ONLY_FALSE@ launchd-launchd_internalServer.$(OBJEXT) \ @LIBS_ONLY_FALSE@ launchd-job_replyUser.$(OBJEXT) \ @LIBS_ONLY_FALSE@ launchd-launchd_runtime.$(OBJEXT) \ -@LIBS_ONLY_FALSE@ launchd-launchd_runtime_kill.$(OBJEXT) +@LIBS_ONLY_FALSE@ launchd-launchd_runtime_kill.$(OBJEXT) \ +@LIBS_ONLY_FALSE@ launchd-job_forwardUser.$(OBJEXT) launchd_OBJECTS = $(am_launchd_OBJECTS) launchd_LDADD = $(LDADD) launchd_LINK = $(CCLD) $(launchd_CFLAGS) $(CFLAGS) $(launchd_LDFLAGS) \ @@ -253,7 +255,7 @@ @LIBS_ONLY_FALSE@SystemStarter_SOURCES = StartupItems.c IPC.c SystemStarter.c @LIBS_ONLY_FALSE@launchd_CFLAGS = -mdynamic-no-pic $(AM_CFLAGS) -Wno-unused-parameter @LIBS_ONLY_FALSE@launchd_LDFLAGS = -lbsm -@LIBS_ONLY_FALSE@launchd_SOURCES = launchd.c launchd_core_logic.c launchd_unix_ipc.c protocol_vprocServer.c notifyServer.c launchd_internalUser.c launchd_internalServer.c job_replyUser.c launchd_runtime.c launchd_runtime_kill.c +@LIBS_ONLY_FALSE@launchd_SOURCES = launchd.c launchd_core_logic.c launchd_unix_ipc.c protocol_vprocServer.c notifyServer.c launchd_internalUser.c launchd_internalServer.c job_replyUser.c launchd_runtime.c launchd_runtime_kill.c job_forwardUser.c @LIBS_ONLY_FALSE@launchproxy_LDFLAGS = -weak_framework Security @LIBS_ONLY_FALSE@man1_MANS = wait4path.1 launchctl.1 @LIBS_ONLY_FALSE@man5_MANS = launchd.plist.5 launchd.conf.5 @@ -415,6 +417,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SystemStarter-StartupItems.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SystemStarter-SystemStarter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchctl-launchctl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchd-job_forwardUser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchd-job_replyUser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchd-launchd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchd-launchd_core_logic.Po@am__quote@ @@ -787,6 +790,20 @@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_runtime_kill.c' object='launchd-launchd_runtime_kill.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_runtime_kill.obj `if test -f 'launchd_runtime_kill.c'; then $(CYGPATH_W) 'launchd_runtime_kill.c'; else $(CYGPATH_W) '$(srcdir)/launchd_runtime_kill.c'; fi` + +launchd-job_forwardUser.o: job_forwardUser.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-job_forwardUser.o -MD -MP -MF $(DEPDIR)/launchd-job_forwardUser.Tpo -c -o launchd-job_forwardUser.o `test -f 'job_forwardUser.c' || echo '$(srcdir)/'`job_forwardUser.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-job_forwardUser.Tpo $(DEPDIR)/launchd-job_forwardUser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='job_forwardUser.c' object='launchd-job_forwardUser.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-job_forwardUser.o `test -f 'job_forwardUser.c' || echo '$(srcdir)/'`job_forwardUser.c + +launchd-job_forwardUser.obj: job_forwardUser.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-job_forwardUser.obj -MD -MP -MF $(DEPDIR)/launchd-job_forwardUser.Tpo -c -o launchd-job_forwardUser.obj `if test -f 'job_forwardUser.c'; then $(CYGPATH_W) 'job_forwardUser.c'; else $(CYGPATH_W) '$(srcdir)/job_forwardUser.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-job_forwardUser.Tpo $(DEPDIR)/launchd-job_forwardUser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='job_forwardUser.c' object='launchd-job_forwardUser.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-job_forwardUser.obj `if test -f 'job_forwardUser.c'; then $(CYGPATH_W) 'job_forwardUser.c'; else $(CYGPATH_W) '$(srcdir)/job_forwardUser.c'; fi` install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @@ -1149,8 +1166,11 @@ @LIBS_ONLY_TRUE@ cp liblaunch_profile.a $(DESTDIR)/usr/local/lib/system/liblaunch_profile.a @LIBS_ONLY_FALSE@launchd_runtime.c:: notifyServer.h launchd_internal.h -@LIBS_ONLY_FALSE@launchd_core_logic.c:: protocol_vproc.h job_reply.h protocol_vprocServer.h +@LIBS_ONLY_FALSE@launchd_core_logic.c:: protocol_vproc.h job_reply.h protocol_vprocServer.h job_forward.h +@LIBS_ONLY_FALSE@job_forwardUser.c job_forward.h: $(srcdir)/protocol_job_forward.defs +@LIBS_ONLY_FALSE@ mig $(MIGFLAGS) -sheader /dev/null -server /dev/null $(srcdir)/protocol_job_forward.defs + @LIBS_ONLY_FALSE@notifyServer.c notifyServer.h: /usr/include/mach/notify.defs @LIBS_ONLY_FALSE@ mig $(MIGFLAGS) -header /dev/null -user /dev/null -sheader notifyServer.h /usr/include/mach/notify.defs Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-10-23 15:29:03 UTC (rev 23442) +++ trunk/launchd/src/launchd_core_logic.c 2007-10-23 15:40:55 UTC (rev 23443) @@ -91,6 +91,7 @@ #include "protocol_vproc.h" #include "protocol_vprocServer.h" #include "job_reply.h" +#include "job_forward.h" #define LAUNCHD_MIN_JOB_RUN_TIME 10 #define LAUNCHD_DEFAULT_EXIT_TIMEOUT 20 @@ -5741,7 +5742,7 @@ } kern_return_t -job_mig_look_up2(job_t j, name_t servicename, mach_port_t *serviceportp, mach_msg_type_name_t *ptype, pid_t target_pid, uint64_t flags) +job_mig_look_up2(job_t j, mach_port_t srp, name_t servicename, mach_port_t *serviceportp, pid_t target_pid, uint64_t flags) { struct machservice *ms; struct ldcred ldc; @@ -5788,12 +5789,12 @@ j->lastlookup_gennum = ms->gen_num; #endif *serviceportp = machservice_port(ms); - *ptype = MACH_MSG_TYPE_COPY_SEND; kr = BOOTSTRAP_SUCCESS; } else if (!(flags & BOOTSTRAP_PER_PID_SERVICE) && (inherited_bootstrap_port != MACH_PORT_NULL)) { job_log(j, LOG_DEBUG, "Mach service lookup forwarded: %s", servicename); - *ptype = MACH_MSG_TYPE_MOVE_SEND; - kr = bootstrap_look_up(inherited_bootstrap_port, servicename, serviceportp); + job_assumes(j, vproc_mig_look_up2_forward(inherited_bootstrap_port, srp, servicename, 0, 0) == 0); + /* The previous routine moved the reply port, we're forced to return MIG_NO_REPLY now */ + return MIG_NO_REPLY; } else if (getpid() == 1 && j->anonymous && ldc.euid >= 500 && strcasecmp(job_get_bs(j)->name, VPROCMGR_SESSION_LOGINWINDOW) == 0) { /* * 5240036 Should start background session when a lookup of CCacheServer occurs @@ -5811,7 +5812,7 @@ } kern_return_t -job_mig_parent(job_t j, mach_port_t *parentport, mach_msg_type_name_t *pptype) +job_mig_parent(job_t j, mach_port_t srp, mach_port_t *parentport) { if (!launchd_assumes(j != NULL)) { return BOOTSTRAP_NO_MEMORY; @@ -5820,15 +5821,14 @@ job_log(j, LOG_DEBUG, "Requested parent bootstrap port"); jobmgr_t jm = j->mgr; - *pptype = MACH_MSG_TYPE_MAKE_SEND; - if (jobmgr_parent(jm)) { *parentport = jobmgr_parent(jm)->jm_port; } else if (MACH_PORT_NULL == inherited_bootstrap_port) { *parentport = jm->jm_port; } else { - *pptype = MACH_MSG_TYPE_COPY_SEND; - *parentport = inherited_bootstrap_port; + job_assumes(j, vproc_mig_parent_forward(inherited_bootstrap_port, srp) == 0); + /* The previous routine moved the reply port, we're forced to return MIG_NO_REPLY now */ + return MIG_NO_REPLY; } return BOOTSTRAP_SUCCESS; } Modified: trunk/launchd/src/protocol_job.defs =================================================================== --- trunk/launchd/src/protocol_job.defs 2007-10-23 15:29:03 UTC (rev 23442) +++ trunk/launchd/src/protocol_job.defs 2007-10-23 15:40:55 UTC (rev 23443) @@ -63,8 +63,9 @@ routine look_up2( __bs_port : job_t; + sreplyport __rport : mach_port_make_send_once_t; __service_name : name_t; - out __service_port : mach_port_send_t; + out __service_port : mach_port_t; __target_pid : pid_t; __flags : uint64_t); @@ -76,7 +77,8 @@ routine parent( __bs_port : job_t; - out __parent_port : mach_port_send_t); + sreplyport __rport : mach_port_make_send_once_t; + out __parent_port : mach_port_make_send_t); routine post_fork_ping( __bs_port : job_t; Added: trunk/launchd/src/protocol_job_forward.defs =================================================================== --- trunk/launchd/src/protocol_job_forward.defs (rev 0) +++ trunk/launchd/src/protocol_job_forward.defs 2007-10-23 15:40:55 UTC (rev 23443) @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2007 Apple Inc. All rights reserved. + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +subsystem job_forward 400; + +#include <mach/std_types.defs> +#include <mach/mach_types.defs> +#include "launchd_mig_types.defs" +import "libvproc_public.h"; +import "libvproc_private.h"; +import "libvproc_internal.h"; + +userprefix vproc_mig_; +serverprefix job_mig_; + +skip; /* create_server */ + +skip; /* reboot2 */ + +skip; /* check_in */ + +skip; /* register2 */ + +simpleroutine look_up2_forward( + __bs_port : job_t; + replyport __rport : mach_port_move_send_once_t; + __service_name : name_t; + __target_pid : pid_t; + __flags : uint64_t); + +skip; /* send_signal */ + +simpleroutine parent_forward( + __bs_port : job_t; + replyport __rport : mach_port_move_send_once_t); +