Projects
Browse Source     Search     Timeline     Wiki

Changeset 23037

Show
Ignore:
Timestamp:
02/07/07 10:26:57 (22 months ago)
Author:
zarzycki@…
Message:

<rdar://problem/4941920> job_export_all() crash via launchd's Unix IPC

Location:
trunk/launchd/src
Files:
2 modified

Legend:

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

    r23035 r23037  
    977977        } 
    978978 
    979         job_dispatch(j, false); 
    980  
    981         return j; 
     979        return job_dispatch(j, false); 
    982980} 
    983981 
     
    16421640jobmgr_dispatch_all(jobmgr_t jm) 
    16431641{ 
    1644         jobmgr_t jmi; 
    1645         job_t ji; 
    1646  
    1647         SLIST_FOREACH(jmi, &jm->submgrs, sle) { 
     1642        jobmgr_t jmi, jmn; 
     1643        job_t ji, jn; 
     1644 
     1645        SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) { 
    16481646                jobmgr_dispatch_all(jmi); 
    16491647        } 
    16501648 
    1651         SLIST_FOREACH(ji, &jm->jobs, sle) { 
     1649        SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 
    16521650                job_dispatch(ji, false); 
    16531651        } 
    16541652} 
    16551653 
    1656 void 
     1654job_t 
    16571655job_dispatch(job_t j, bool kickstart) 
    16581656{ 
     
    16651663         * This is a classic example. The act of dispatching a job may delete it. 
    16661664         */ 
    1667         if (job_active(j)) { 
    1668                 return; 
    1669         } else if (job_useless(j)) { 
    1670                 job_remove(j); 
    1671         } else if (kickstart || job_keepalive(j)) { 
    1672                 job_start(j); 
    1673         } else { 
    1674                 job_watch(j); 
    1675         } 
     1665        if (!job_active(j)) { 
     1666                if (job_useless(j)) { 
     1667                        job_remove(j); 
     1668                        return NULL; 
     1669                } else if (kickstart || job_keepalive(j)) { 
     1670                        job_start(j); 
     1671                } else { 
     1672                        job_watch(j); 
     1673                } 
     1674        } 
     1675 
     1676        return j; 
    16761677} 
    16771678 
     
    34693470        } 
    34703471 
     3472        /* We don't need the _SAFE version because we return after the job_dispatch() */ 
    34713473        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    34723474                SLIST_FOREACH(ms, &ji->machservices, sle) { 
     
    36143616jobmgr_dispatch_all_semaphores(jobmgr_t jm) 
    36153617{ 
    3616         jobmgr_t jmi; 
     3618        jobmgr_t jmi, jmn; 
    36173619        job_t ji, jn; 
    36183620 
    36193621 
    3620         SLIST_FOREACH(jmi, &jm->submgrs, sle) { 
     3622        SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) { 
    36213623                jobmgr_dispatch_all_semaphores(jmi); 
    36223624        } 
     
    39803982                ms->hide = true; 
    39813983 
    3982                 job_dispatch(ji, false); 
    3983         } 
    3984  
    3985         *up_cont = machservice_port(SLIST_FIRST(&ji->machservices)); 
     3984                ji = job_dispatch(ji, false); 
     3985        } 
     3986 
     3987        if (job_assumes(j, ji != NULL)) { 
     3988                *up_cont = machservice_port(SLIST_FIRST(&ji->machservices)); 
     3989        } 
    39863990 
    39873991        return 0; 
     
    45394543        jr->j_binpref_cnt = binpref_cnt; 
    45404544 
    4541         job_dispatch(jr, true); 
     4545        jr = job_dispatch(jr, true); 
     4546 
     4547        if (!job_assumes(j, jr != NULL)) { 
     4548                return BOOTSTRAP_NO_MEMORY; 
     4549        } 
    45424550 
    45434551        if (!job_setup_machport(jr)) { 
  • trunk/launchd/src/launchd_core_logic.h

    r23009 r23037  
    4444 
    4545job_t job_new(jobmgr_t jm, const char *label, const char *prog, const char *const *argv, const char *stdinpath); 
    46 void job_dispatch(job_t j, bool kickstart); 
     46job_t job_dispatch(job_t j, bool kickstart); /* returns j on success, NULL on job removal */ 
    4747bool job_active(job_t j); 
    4848launch_data_t job_export(job_t j);