Projects
Browse Source     Search     Timeline     Wiki

Changeset 23272

Show
Ignore:
Timestamp:
06/04/07 11:26:07 (18 months ago)
Author:
zarzycki@…
Message:

<rdar://problem/5242567> Bug: launchd_core_logic.c:978 (23264):3: kevent_mod(jr->p, EVFILT_PROC, EV_ADD, proc_fflags, 0, root_jobmgr) != -1

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/launchd/src/launchd_core_logic.c

    r23271 r23272  
    341341                     currently_ignored:1, forced_peers_to_demand_mode:1, setnice:1, hopefully_exits_last:1, removal_pending:1, 
    342342                     wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1, weird_bootstrap:1, start_on_mount:1, 
    343                      per_user:1, hopefully_exits_first:1, deny_unknown_mslookups:1; 
     343                     per_user:1, hopefully_exits_first:1, deny_unknown_mslookups:1, unload_at_mig_return:1; 
    344344        const char label[0]; 
    345345}; 
     
    940940        struct kinfo_proc kp; 
    941941        size_t len = sizeof(kp); 
     942        const char *zombie = NULL; 
    942943        bool shutdown_state; 
    943944        job_t jp = NULL, jr = NULL; 
    944945 
     946        if (!jobmgr_assumes(jm, anonpid != 0)) { 
     947                return NULL; 
     948        } 
     949 
    945950        if (!jobmgr_assumes(jm, sysctl(mib, 4, &kp, &len, NULL, 0) != -1)) { 
    946951                return NULL; 
     952        } 
     953 
     954        if (kp.kp_proc.p_stat == SZOMB) { 
     955                jobmgr_log(jm, LOG_DEBUG, "Tried to create an anonymous job for zombie PID: %u", anonpid); 
     956                zombie = "zombie"; 
    947957        } 
    948958 
     
    967977        } 
    968978 
    969         if (jobmgr_assumes(jm, (jr = job_new(jm, AUTO_PICK_LEGACY_LABEL, kp.kp_proc.p_comm, NULL)) != NULL)) { 
     979        if (jobmgr_assumes(jm, (jr = job_new(jm, AUTO_PICK_LEGACY_LABEL, zombie ? zombie : kp.kp_proc.p_comm, NULL)) != NULL)) { 
    970980                u_int proc_fflags = NOTE_EXEC|NOTE_EXIT|NOTE_REAP; 
    971981 
     
    976986                /* anonymous process reaping is messy */ 
    977987                LIST_INSERT_HEAD(&jm->active_jobs[ACTIVE_JOB_HASH(jr->p)], jr, pid_hash_sle); 
    978                 job_assumes(jr, kevent_mod(jr->p, EVFILT_PROC, EV_ADD, proc_fflags, 0, root_jobmgr) != -1); 
     988 
     989                if (kevent_mod(jr->p, EVFILT_PROC, EV_ADD, proc_fflags, 0, root_jobmgr) == -1 && job_assumes(jr, errno == ESRCH)) { 
     990                        /* zombies are weird */ 
     991                        jr->unload_at_mig_return = true; 
     992                } 
    979993 
    980994                if (jp) { 
     
    9861000                } 
    9871001 
    988                 job_log(jr, LOG_DEBUG, "Created anonymously by PPID %u%s%s", kp.kp_eproc.e_ppid, jp ? ": " : "", jp ? jp->label : ""); 
     1002                job_log(jr, LOG_DEBUG, "Created PID %u anonymously by PPID %u%s%s", anonpid, kp.kp_eproc.e_ppid, jp ? ": " : "", jp ? jp->label : ""); 
    9891003        } 
    9901004 
     
    17711785 
    17721786void 
    1773 job_mig_destructor(job_t j __attribute__((unused))) 
    1774 { 
     1787job_mig_destructor(job_t j) 
     1788{ 
     1789        if (j->unload_at_mig_return) { 
     1790                job_remove(j); 
     1791        } 
    17751792} 
    17761793