[launchd-changes] [23031] trunk/launchd/src/launchd_runtime.c
source_changes at macosforge.org
source_changes at macosforge.org
Tue Feb 6 09:50:05 PST 2007
Revision: 23031
http://trac.macosforge.org/projects/launchd/changeset/23031
Author: zarzycki at apple.com
Date: 2007-02-06 09:50:05 -0800 (Tue, 06 Feb 2007)
Log Message:
-----------
<rdar://problem/4978693> Code to help track down an elusive crash
Modified Paths:
--------------
trunk/launchd/src/launchd_runtime.c
Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c 2007-02-05 22:11:46 UTC (rev 23030)
+++ trunk/launchd/src/launchd_runtime.c 2007-02-06 17:50:05 UTC (rev 23031)
@@ -34,12 +34,14 @@
#include <mach/host_info.h>
#include <mach/mach_host.h>
#include <mach/exception.h>
+#include <mach-o/dyld.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/event.h>
#include <sys/queue.h>
#include <sys/socket.h>
#include <bsm/libbsm.h>
+#include <malloc/malloc.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
@@ -190,6 +192,36 @@
return NULL;
}
+static bool
+ptr_is_in_exe(void *ptr)
+{
+ uint32_t i, count = _dyld_image_count();
+
+ for (i = 0; i < count; i++) {
+ const struct mach_header *header = _dyld_get_image_header(i);
+ uint32_t j, offset = _dyld_get_image_vmaddr_slide(i);
+ struct segment_command *seg;
+ struct load_command *cmd;
+
+ j = 0;
+ cmd = (struct load_command*)((char *)header + sizeof(struct mach_header));
+
+ while (j < header->ncmds) {
+ if (cmd->cmd == LC_SEGMENT) {
+ seg = (struct segment_command*)cmd;
+ if (((uint32_t)ptr >= (seg->vmaddr + offset)) && ((uint32_t)ptr < (seg->vmaddr + offset + seg->vmsize))) {
+ return true;
+ }
+ }
+
+ j++;
+ cmd = (struct load_command*)((char*)cmd + cmd->cmdsize);
+ }
+ }
+
+ return false;
+}
+
kern_return_t
x_handle_kqueue(mach_port_t junk __attribute__((unused)), integer_t fd)
{
@@ -200,7 +232,12 @@
launchd_assumes((kevr = kevent(fd, NULL, 0, &kev, 1, &ts)) != -1);
if (kevr == 1) {
- (*((kq_callback *)kev.udata))(kev.udata, &kev);
+ if (launchd_assumes(malloc_size(kev.udata) || ptr_is_in_exe(kev.udata))) {
+ (*((kq_callback *)kev.udata))(kev.udata, &kev);
+ } else {
+ syslog(LOG_ERR, "kev.ident == 0x%x kev.filter == 0x%x kev.fflags = 0x%x kev.udata = 0x%x",
+ kev.ident, kev.filter, kev.fflags, kev.udata);
+ }
}
launchd_post_kevent();
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070206/aeb9db8b/attachment.html
More information about the launchd-changes
mailing list