]> git.saurik.com Git - apple/launchd.git/commitdiff
launchd-258.1.tar.gz mac-os-x-1052 v258.1
authorApple <opensource@apple.com>
Fri, 7 Dec 2007 21:15:23 +0000 (21:15 +0000)
committerApple <opensource@apple.com>
Fri, 7 Dec 2007 21:15:23 +0000 (21:15 +0000)
launchd/src/Makefile.am
launchd/src/Makefile.in
launchd/src/launchctl.c
launchd/src/launchd_core_logic.c
launchd/src/launchd_runtime.c
launchd/src/launchd_runtime.h
launchd/src/launchproxy.c
launchd/src/liblaunch_private.h

index 788b6f23e6012586bc03bd912ebb48eae475333a..dc9af966e0711892f978b14f27c6a34213f25d28 100644 (file)
@@ -2,7 +2,7 @@ AM_CFLAGS = -no-cpp-precomp -F/System/Library/PrivateFrameworks -Wall -Wextra -W
 
 CLEANFILES = protocol_vproc.h protocol_vprocServer.c protocol_vprocUser.c protocol_vprocServer.h               \
             launchd_internal.h launchd_internalServer.h launchd_internalServer.c launchd_internalUser.c        \
-            notifyServer.c notifyServer.h job_replyUser.c job_reply.h __version.c
+            notifyServer.c notifyServer.h job_replyUser.c job_reply.h __version.c mach_excServer.c mach_excServer.h
 
 protocol_vproc.h protocol_vprocServer.c protocol_vprocUser.c protocol_vprocServer.h: $(srcdir)/protocol_job.defs
        mig $(MIGFLAGS) -sheader protocol_vprocServer.h $(srcdir)/protocol_job.defs
@@ -48,9 +48,9 @@ SystemStarter_SOURCES = StartupItems.c IPC.c SystemStarter.c
 
 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 mach_excServer.c
 
-launchd_runtime.c:: notifyServer.h launchd_internal.h
+launchd_runtime.c:: notifyServer.h launchd_internal.h mach_excServer.h
 launchd_core_logic.c:: protocol_vproc.h job_reply.h protocol_vprocServer.h
 
 launchproxy_LDFLAGS = -weak_framework Security
@@ -58,6 +58,9 @@ launchproxy_LDFLAGS = -weak_framework Security
 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
 
+mach_excServer.c mach_excServer.h: /usr/include/mach/mach_exc.defs
+       mig $(MIGFLAGS) -header /dev/null -user /dev/null -sheader mach_excServer.h /usr/include/mach/mach_exc.defs
+
 job_replyUser.c job_reply.h: $(srcdir)/protocol_job_reply.defs
        mig $(MIGFLAGS) -sheader /dev/null -server /dev/null $(srcdir)/protocol_job_reply.defs
 
index 8df689164b5caf78666a53e09cfa00f10b4fdb1c..6a4b01cbfd97d9ff55454cb5e3ad232301580630 100644 (file)
@@ -96,7 +96,8 @@ launchctl_LINK = $(CCLD) $(launchctl_CFLAGS) $(CFLAGS) \
 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 \
+       mach_excServer.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 @@ am__launchd_SOURCES_DIST = launchd.c launchd_core_logic.c \
 @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-mach_excServer.$(OBJEXT)
 launchd_OBJECTS = $(am_launchd_OBJECTS)
 launchd_LDADD = $(LDADD)
 launchd_LINK = $(CCLD) $(launchd_CFLAGS) $(CFLAGS) $(launchd_LDFLAGS) \
@@ -238,7 +240,7 @@ top_srcdir = @top_srcdir@
 AM_CFLAGS = -no-cpp-precomp -F/System/Library/PrivateFrameworks -Wall -Wextra -Waggregate-return -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror -D__MigTypeCheck=1 -fvisibility=hidden -Dmig_external=__private_extern__
 CLEANFILES = protocol_vproc.h protocol_vprocServer.c protocol_vprocUser.c protocol_vprocServer.h               \
             launchd_internal.h launchd_internalServer.h launchd_internalServer.c launchd_internalUser.c        \
-            notifyServer.c notifyServer.h job_replyUser.c job_reply.h __version.c
+            notifyServer.c notifyServer.h job_replyUser.c job_reply.h __version.c mach_excServer.c mach_excServer.h
 
 @LIBS_ONLY_TRUE@noinst_LIBRARIES = liblaunch.a liblaunch_profile.a
 @LIBS_ONLY_TRUE@liblaunch_a_CFLAGS = -D__DARWIN_NON_CANCELABLE=1 $(AM_CFLAGS)
@@ -253,7 +255,7 @@ CLEANFILES = protocol_vproc.h protocol_vprocServer.c protocol_vprocUser.c protoc
 @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 mach_excServer.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
@@ -423,6 +425,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchd-launchd_runtime.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchd-launchd_runtime_kill.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchd-launchd_unix_ipc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchd-mach_excServer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchd-notifyServer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchd-protocol_vprocServer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/launchproxy.Po@am__quote@
@@ -787,6 +790,20 @@ launchd-launchd_runtime_kill.obj: launchd_runtime_kill.c
 @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-mach_excServer.o: mach_excServer.c
+@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-mach_excServer.o -MD -MP -MF $(DEPDIR)/launchd-mach_excServer.Tpo -c -o launchd-mach_excServer.o `test -f 'mach_excServer.c' || echo '$(srcdir)/'`mach_excServer.c
+@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/launchd-mach_excServer.Tpo $(DEPDIR)/launchd-mach_excServer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mach_excServer.c' object='launchd-mach_excServer.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-mach_excServer.o `test -f 'mach_excServer.c' || echo '$(srcdir)/'`mach_excServer.c
+
+launchd-mach_excServer.obj: mach_excServer.c
+@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-mach_excServer.obj -MD -MP -MF $(DEPDIR)/launchd-mach_excServer.Tpo -c -o launchd-mach_excServer.obj `if test -f 'mach_excServer.c'; then $(CYGPATH_W) 'mach_excServer.c'; else $(CYGPATH_W) '$(srcdir)/mach_excServer.c'; fi`
+@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/launchd-mach_excServer.Tpo $(DEPDIR)/launchd-mach_excServer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mach_excServer.c' object='launchd-mach_excServer.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-mach_excServer.obj `if test -f 'mach_excServer.c'; then $(CYGPATH_W) 'mach_excServer.c'; else $(CYGPATH_W) '$(srcdir)/mach_excServer.c'; fi`
 install-man1: $(man1_MANS) $(man_MANS)
        @$(NORMAL_INSTALL)
        test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
@@ -1148,12 +1165,15 @@ protocol_vproc.h protocol_vprocServer.c protocol_vprocUser.c protocol_vprocServe
 @LIBS_ONLY_TRUE@       cp liblaunch.a $(DESTDIR)/usr/local/lib/system/liblaunch_debug.a
 @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_runtime.c:: notifyServer.h launchd_internal.h mach_excServer.h
 @LIBS_ONLY_FALSE@launchd_core_logic.c:: protocol_vproc.h job_reply.h protocol_vprocServer.h
 
 @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
 
+@LIBS_ONLY_FALSE@mach_excServer.c mach_excServer.h: /usr/include/mach/mach_exc.defs
+@LIBS_ONLY_FALSE@      mig $(MIGFLAGS) -header /dev/null -user /dev/null -sheader mach_excServer.h /usr/include/mach/mach_exc.defs
+
 @LIBS_ONLY_FALSE@job_replyUser.c job_reply.h: $(srcdir)/protocol_job_reply.defs
 @LIBS_ONLY_FALSE@      mig $(MIGFLAGS) -sheader /dev/null -server /dev/null $(srcdir)/protocol_job_reply.defs
 
index f238119535ef8f39ce6d120f77772e544cb205ed..6b5efa3fbd9638d9b1c3fc62b8adce173d7f3c49 100644 (file)
@@ -18,7 +18,7 @@
  * @APPLE_APACHE_LICENSE_HEADER_END@
  */
 
-static const char *const __rcs_file_version__ = "$Revision: 23400 $";
+static const char *const __rcs_file_version__ = "$Revision: 23457 $";
 
 #include "liblaunch_public.h"
 #include "liblaunch_private.h"
@@ -148,6 +148,7 @@ static void do_single_user_mode(bool);
 static bool do_single_user_mode2(void);
 static void read_launchd_conf(void);
 static bool job_disabled_logic(launch_data_t obj);
+static void fix_bogus_file_metadata(void);
 
 typedef enum {
        BOOTCACHE_START = 1,
@@ -2764,7 +2765,10 @@ do_potential_fsck(void)
                goto out;
        }
 
-       fprintf(stderr, "fsck failed! Leaving the root file system read-only...\n");
+       fprintf(stderr, "fsck failed!\n");
+
+       /* someday, we should keep booting read-only, but as of today, other sub-systems cannot handle that scenario */
+       assumes(reboot(RB_HALT) != -1);
 
        return;
 out:
@@ -2779,6 +2783,64 @@ out:
         */
 
        assumes(fwexec(remount_tool, true) != -1);
+
+       fix_bogus_file_metadata();
+}
+
+void
+fix_bogus_file_metadata(void)
+{
+       static const struct {
+               const char *path;
+               const uid_t owner;
+               const gid_t group;
+               const mode_t needed_bits;
+               const mode_t bad_bits;
+       } f[] = {
+               { "/sbin/launchd", 0, 0, S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, S_ISUID|S_ISGID|S_ISVTX|S_IWOTH },
+               { _PATH_TMP, 0, 0, S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO, S_ISUID|S_ISGID },
+               { _PATH_VARTMP, 0, 0, S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO, S_ISUID|S_ISGID },
+       };
+       struct stat sb;
+       size_t i;
+
+       for (i = 0; i < (sizeof(f) / sizeof(f[0])); i++) {
+               mode_t i_needed_bits;
+               mode_t i_bad_bits;
+               bool fix_mode = false;
+               bool fix_id = false;
+
+               if (!assumes(stat(f[i].path, &sb) != -1)) {
+                       continue;
+               }
+
+               i_needed_bits = ~sb.st_mode & f[i].needed_bits;
+               i_bad_bits = sb.st_mode & f[i].bad_bits;
+
+               if (i_bad_bits) {
+                       fprintf(stderr, "Crucial filesystem check: Removing bogus mode bits 0%o on path: %s\n", i_bad_bits, f[i].path);
+                       fix_mode = true;
+               }
+               if (i_needed_bits) {
+                       fprintf(stderr, "Crucial filesystem check: Adding missing mode bits 0%o on path: %s\n", i_needed_bits, f[i].path);
+                       fix_mode = true;
+               }
+               if (sb.st_uid != f[i].owner) {
+                       fprintf(stderr, "Crucial filesystem check: Fixing bogus UID %u on path: %s\n", sb.st_uid, f[i].path);
+                       fix_id = true;
+               }
+               if (sb.st_gid != f[i].group) {
+                       fprintf(stderr, "Crucial filesystem check: Fixing bogus GID %u on path: %s\n", sb.st_gid, f[i].path);
+                       fix_id = true;
+               }
+
+               if (fix_mode) {
+                       assumes(chmod(f[i].path, (sb.st_mode & ~i_bad_bits) | i_needed_bits) != -1);
+               }
+               if (fix_id) {
+                       assumes(chown(f[i].path, f[i].owner, f[i].group) != -1);
+               }
+       }
 }
 
 bool
index 726ab6342a3f48d769ffed4ee51c3639c26a95aa..cdbbde2094edda73a3530d6a3f20e0cfa1da048e 100644 (file)
@@ -16,7 +16,7 @@
  * @APPLE_APACHE_LICENSE_HEADER_END@
  */
 
-static const char *const __rcs_file_version__ = "$Revision: 23433 $";
+static const char *const __rcs_file_version__ = "$Revision: 23459 $";
 
 #include "config.h"
 #include "launchd_core_logic.h"
@@ -333,6 +333,7 @@ struct job_s {
        char *groupname;
        char *stdoutpath;
        char *stderrpath;
+       char *alt_exc_handler;
        struct machservice *lastlookup;
        unsigned int lastlookup_gennum;
        char *seatbelt_profile;
@@ -360,7 +361,7 @@ struct job_s {
                     currently_ignored:1, forced_peers_to_demand_mode:1, setnice:1, hopefully_exits_last:1, removal_pending:1,
                     wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1, weird_bootstrap:1, start_on_mount:1,
                     per_user:1, hopefully_exits_first:1, deny_unknown_mslookups:1, unload_at_mig_return:1, abandon_pg:1,
-                    poll_for_vfs_changes:1;
+                    poll_for_vfs_changes:1, internal_exc_handler:1;
        const char label[0];
 };
 
@@ -861,6 +862,9 @@ job_remove(job_t j)
        if (j->stderrpath) {
                free(j->stderrpath);
        }
+       if (j->alt_exc_handler) {
+               free(j->alt_exc_handler);
+       }
        if (j->seatbelt_profile) {
                free(j->seatbelt_profile);
        }
@@ -1323,6 +1327,13 @@ job_import_bool(job_t j, const char *key, bool value)
                        found_key = true;
                }
                break;
+       case 'm':
+       case 'M':
+               if (strcasecmp(key, LAUNCH_JOBKEY_MACHEXCEPTIONHANDLER) == 0) {
+                       j->internal_exc_handler = value;
+                       found_key = true;
+               }
+               break;
        case 'i':
        case 'I':
                if (strcasecmp(key, LAUNCH_JOBKEY_INITGROUPS) == 0) {
@@ -1376,6 +1387,12 @@ job_import_string(job_t j, const char *key, const char *value)
        char **where2put = NULL;
 
        switch (key[0]) {
+       case 'm':
+       case 'M':
+               if (strcasecmp(key, LAUNCH_JOBKEY_MACHEXCEPTIONHANDLER) == 0) {
+                       where2put = &j->alt_exc_handler;
+               }
+               break;
        case 'p':
        case 'P':
                if (strcasecmp(key, LAUNCH_JOBKEY_PROGRAM) == 0) {
@@ -2515,6 +2532,11 @@ job_start(job_t j)
                        job_assumes(j, runtime_close(spair[0]) == 0);
                        job_assumes(j, runtime_close(spair[1]) == 0);
                }
+               if (!j->legacy_mach_job) {
+                       job_assumes(j, runtime_close(oepair[0]) != -1);
+                       job_assumes(j, runtime_close(oepair[1]) != -1);
+                       j->log_redirect_fd = 0;
+               }
                break;
        case 0:
                if (_vproc_post_fork_ping()) {
@@ -3997,9 +4019,20 @@ machservice_status(struct machservice *ms)
 void
 job_setup_exception_port(job_t j, task_t target_task)
 {
+       struct machservice *ms;
        thread_state_flavor_t f = 0;
+       mach_port_t exc_port = the_exception_server;
 
-       if (!the_exception_server) {
+       if (j->alt_exc_handler) {
+               ms = jobmgr_lookup_service(j->mgr, j->alt_exc_handler, true, 0);
+               if (ms) {
+                       exc_port = machservice_port(ms);
+               } else {
+                       job_log(j, LOG_WARNING, "Falling back to default Mach exception handler. Could not find: %s", j->alt_exc_handler);
+               }
+       } else if (j->internal_exc_handler) {
+               exc_port = runtime_get_kernel_port();
+       } else if (!exc_port) {
                return;
        }
 
@@ -4010,9 +4043,9 @@ job_setup_exception_port(job_t j, task_t target_task)
 #endif
 
        if (target_task) {
-               job_assumes(j, task_set_exception_ports(target_task, EXC_MASK_CRASH, the_exception_server,
+               job_assumes(j, task_set_exception_ports(target_task, EXC_MASK_CRASH, exc_port,
                                        EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, f) == KERN_SUCCESS);
-       } else if (getpid() == 1) {
+       } else if (getpid() == 1 && the_exception_server) {
                mach_port_t mhp = mach_host_self();
                job_assumes(j, host_set_exception_ports(mhp, EXC_MASK_CRASH, the_exception_server,
                                        EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, f) == KERN_SUCCESS);
@@ -6447,14 +6480,17 @@ job_mig_spawn(job_t j, vm_offset_t indata, mach_msg_type_number_t indataCnt, pid
                return BOOTSTRAP_NO_MEMORY;
        }
 
-       job_assumes(jr, jr->p);
+       if (!job_assumes(jr, jr->p)) {
+               job_remove(jr);
+               return BOOTSTRAP_NO_MEMORY;
+       }
 
        if (!job_setup_machport(jr)) {
                job_remove(jr);
                return BOOTSTRAP_NO_MEMORY;
        }
 
-       job_log(j, LOG_INFO, "Spawned");
+       job_log(jr, LOG_DEBUG, "Spawned by PID %u: %s", j->p, j->label);
 
        *child_pid = jr->p;
        *obsvr_port = jr->j_port;
index 7870ec1b39d0b37edef802bcd1852ad27d2db6f6..909473dabfb84b6aa266f3b15c1bfd6e30291d71 100644 (file)
@@ -18,7 +18,7 @@
  * @APPLE_APACHE_LICENSE_HEADER_END@
  */
 
-static const char *const __rcs_file_version__ = "$Revision: 23432 $";
+static const char *const __rcs_file_version__ = "$Revision: 23459 $";
 
 #include "config.h"
 #include "launchd_runtime.h"
@@ -61,6 +61,7 @@ static const char *const __rcs_file_version__ = "$Revision: 23432 $";
 #include "launchd_internalServer.h"
 #include "launchd_internal.h"
 #include "notifyServer.h"
+#include "mach_excServer.h"
 
 /* We shouldn't be including these */
 #include "launch.h"
@@ -86,6 +87,7 @@ static void *mport_demand_loop(void *arg);
 static void *kqueue_demand_loop(void *arg);
 static void log_kevent_struct(int level, struct kevent *kev, int indx);
 
+static boolean_t launchd_internal_demux(mach_msg_header_t *Request, mach_msg_header_t *Reply);
 static void record_caller_creds(mach_msg_header_t *mh);
 static void launchd_runtime2(mach_msg_size_t msg_size, mig_reply_error_t *bufRequest, mig_reply_error_t *bufReply);
 static mach_msg_size_t max_msg_size;
@@ -115,6 +117,12 @@ static const int sigigns[] = { SIGHUP, SIGINT, SIGPIPE, SIGALRM, SIGTERM,
 };
 static sigset_t sigign_set;
 
+mach_port_t
+runtime_get_kernel_port(void)
+{
+       return launchd_internal_port;
+}
+
 void
 launchd_runtime_init(void)
 {
@@ -251,7 +259,11 @@ reboot_flags_to_C_names(unsigned int flags)
        static char flags_buf[sizeof(MAX_RB_STR)];
        char *flags_off = NULL;
 
-       if (flags) while (flags) {
+       if (flags == 0) {
+               return "RB_AUTOBOOT";
+       }
+
+       while (flags) {
                if (flags_off) {
                        *flags_off = '|';
                        flags_off++;
@@ -275,10 +287,9 @@ reboot_flags_to_C_names(unsigned int flags)
                        flags_off += sprintf(flags_off, "0x%x", flags);
                        flags = 0;
                }
-               return flags_buf;
-       } else {
-               return "RB_AUTOBOOT";
        }
+
+       return flags_buf;
 }
 
 const char *
@@ -647,7 +658,7 @@ launchd_get_bport(mach_port_t *name)
 kern_return_t
 launchd_mport_notify_req(mach_port_t name, mach_msg_id_t which)
 {
-       mach_port_mscount_t msgc = (which == MACH_NOTIFY_NO_SENDERS) ? 1 : 0;
+       mach_port_mscount_t msgc = (which == MACH_NOTIFY_PORT_DESTROYED) ? 0 : 1;
        mach_port_t previous, where = (which == MACH_NOTIFY_NO_SENDERS) ? name : launchd_internal_port;
 
        if (which == MACH_NOTIFY_NO_SENDERS) {
@@ -843,9 +854,11 @@ launchd_internal_demux(mach_msg_header_t *Request, mach_msg_header_t *Reply)
 {
        if (launchd_internal_server_routine(Request)) {
                return launchd_internal_server(Request, Reply);
+       } else if (notify_server_routine(Request)) {
+               return notify_server(Request, Reply);
+       } else {
+               return mach_exc_server(Request, Reply);
        }
-
-       return notify_server(Request, Reply);
 }
 
 kern_return_t
@@ -1447,3 +1460,49 @@ runtime_del_ref(void)
 {
        runtime_busy_cnt--;
 }
+
+kern_return_t
+catch_mach_exception_raise(mach_port_t exception_port, mach_port_t thread, mach_port_t task,
+               exception_type_t exception, mach_exception_data_t code, mach_msg_type_number_t codeCnt)
+{
+       runtime_syslog(LOG_NOTICE, "%s(): thread: 0x%x task: 0x%x type: 0x%x code: %p codeCnt: 0x%x",
+                       __func__, thread, task, exception, code, codeCnt);
+
+       launchd_assumes(launchd_mport_deallocate(thread) == KERN_SUCCESS);
+       launchd_assumes(launchd_mport_deallocate(task) == KERN_SUCCESS);
+
+       return 0;
+}
+
+kern_return_t
+catch_mach_exception_raise_state(mach_port_t exception_port,
+               exception_type_t exception, const mach_exception_data_t code, mach_msg_type_number_t codeCnt,
+               int *flavor, const thread_state_t old_state, mach_msg_type_number_t old_stateCnt,
+               thread_state_t new_state, mach_msg_type_number_t *new_stateCnt)
+{
+       runtime_syslog(LOG_NOTICE, "%s(): type: 0x%x code: %p codeCnt: 0x%x flavor: %p old_state: %p old_stateCnt: 0x%x new_state: %p new_stateCnt: %p",
+                       __func__, exception, code, codeCnt, flavor, old_state, old_stateCnt, new_state, new_stateCnt);
+
+       memcpy(new_state, old_state, old_stateCnt * sizeof(old_state[0]));
+       *new_stateCnt = old_stateCnt;
+
+       return 0;
+}
+
+kern_return_t
+catch_mach_exception_raise_state_identity(mach_port_t exception_port, mach_port_t thread, mach_port_t task,
+               exception_type_t exception, mach_exception_data_t code, mach_msg_type_number_t codeCnt,
+               int *flavor, thread_state_t old_state, mach_msg_type_number_t old_stateCnt,
+               thread_state_t new_state, mach_msg_type_number_t *new_stateCnt)
+{
+       runtime_syslog(LOG_NOTICE, "%s(): thread: 0x%x task: 0x%x type: 0x%x code: %p codeCnt: 0x%x flavor: %p old_state: %p old_stateCnt: 0x%x new_state: %p new_stateCnt: %p",
+                       __func__, thread, task, exception, code, codeCnt, flavor, old_state, old_stateCnt, new_state, new_stateCnt);
+
+       memcpy(new_state, old_state, old_stateCnt * sizeof(old_state[0]));
+       *new_stateCnt = old_stateCnt;
+
+       launchd_assumes(launchd_mport_deallocate(thread) == KERN_SUCCESS);
+       launchd_assumes(launchd_mport_deallocate(task) == KERN_SUCCESS);
+
+       return 0;
+}
index 1f9fdf976517f7d819f0bfb81423cb4a3ac053ab..df875b62455f59918d95a83d743ede1e38b2a6cd 100644 (file)
@@ -56,7 +56,7 @@ typedef void (*kq_callback)(void *, struct kevent *);
 typedef boolean_t (*mig_callback)(mach_msg_header_t *, mach_msg_header_t *);
 typedef void (*timeout_callback)(void);
 
-boolean_t launchd_internal_demux(mach_msg_header_t *Request, mach_msg_header_t *Reply);
+mach_port_t runtime_get_kernel_port(void);
 
 void runtime_add_ref(void);
 void runtime_del_ref(void);
index 4c62dcb824cb341baf16e51c81a6ba3cd3d772ae..d0a07d07d6c1794f94a800b79f2e77db4fb0e0ad 100644 (file)
@@ -194,6 +194,7 @@ int main(int argc __attribute__((unused)), char *argv[])
                                }
                        }
                        fcntl(r, F_SETFL, 0);
+                       fcntl(r, F_SETFD, 1);
                        dup2(r, STDIN_FILENO);
                        if (dupstdout)
                                dup2(r, STDOUT_FILENO);
index bad934ddafb9365bda8767e831ce9fc0153c1816..176dbdb4cd24e3ce010372d88a457c891c6f6c2f 100644 (file)
@@ -55,6 +55,7 @@ __BEGIN_DECLS
 #define LAUNCH_JOBKEY_PERJOBMACHSERVICES       "PerJobMachServices"
 #define LAUNCH_JOBKEY_SERVICEIPC               "ServiceIPC"
 #define LAUNCH_JOBKEY_BINARYORDERPREFERENCE    "BinaryOrderPreference"
+#define LAUNCH_JOBKEY_MACHEXCEPTIONHANDLER     "MachExceptionHandler"
 
 #define LAUNCH_JOBKEY_MACH_KUNCSERVER  "kUNCServer"
 #define LAUNCH_JOBKEY_MACH_EXCEPTIONSERVER     "ExceptionServer"