- // allocate a new session for this server
- sessions[n] = malloc(sizeof(serverSession));
- bzero(sessions[n], sizeof(serverSession));
+ retry_allocate :
+
+#ifdef HAVE_MACHPORT_GUARDS
+ bzero(&opts, sizeof(opts));
+ opts.flags = MPO_CONTEXT_AS_GUARD;
+
+ kr = mach_port_construct(mach_task_self(), &opts, newSession, &mp);
+#else // HAVE_MACHPORT_GUARDS
+ kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &mp);
+#endif // HAVE_MACHPORT_GUARDS
+
+ if (kr != KERN_SUCCESS) {
+ char *err = NULL;
+
+ SCLog(TRUE, LOG_ERR, CFSTR("addSession: could not allocate mach port: %s"), mach_error_string(kr));
+ if ((kr == KERN_NO_SPACE) || (kr == KERN_RESOURCE_SHORTAGE)) {
+ sleep(1);
+ goto retry_allocate;
+ }
+
+ (void) asprintf(&err, "addSession: could not allocate mach port: %s", mach_error_string(kr));
+ _SC_crash(err != NULL ? err : "addSession: could not allocate mach port",
+ NULL,
+ NULL);
+ if (err != NULL) free(err);
+
+ free(newSession);
+ return NULL;
+ }
+ }