Projects
Browse Source     Search     Timeline     Wiki

Changeset 23260

Show
Ignore:
Timestamp:
05/22/07 13:08:55 (19 months ago)
Author:
zarzycki@…
Message:

<rdar://problem/5158497> bootstrap_set_policy: policy should be inherited

Files:
1 modified

Legend:

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

    r23258 r23260  
    108108}; 
    109109 
    110 static bool mspolicy_new(job_t j, const char *name, bool allow, bool pid_local); 
     110static bool mspolicy_new(job_t j, const char *name, bool allow, bool pid_local, bool skip_check); 
     111static bool mspolicy_copy(job_t j_to, job_t j_from); 
    111112static void mspolicy_setup(launch_data_t obj, const char *key, void *context); 
    112113static bool mspolicy_check(job_t j, const char *name, bool pid_local); 
     
    978979{ 
    979980        int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, anonpid }; 
    980         struct kinfo_proc kp, ppid_kp; 
     981        struct kinfo_proc kp; 
    981982        size_t len = sizeof(kp); 
    982983        bool shutdown_state; 
    983         job_t jr = NULL; 
     984        job_t jp = NULL, jr = NULL; 
    984985 
    985986        if (!jobmgr_assumes(jm, sysctl(mib, 4, &kp, &len, NULL, 0) != -1)) { 
     
    987988        } 
    988989 
    989         mib[3] = kp.kp_eproc.e_ppid; 
    990  
    991         if (!jobmgr_assumes(jm, sysctl(mib, 4, &ppid_kp, &len, NULL, 0) != -1)) { 
    992                 return NULL; 
     990        switch (kp.kp_eproc.e_ppid) { 
     991        case 0: 
     992                /* the kernel */ 
     993                break; 
     994        case 1: 
     995                if (getpid() != 1) { 
     996                        break; 
     997                } 
     998                /* fall through */ 
     999        default: 
     1000                jp = jobmgr_find_by_pid(jm, kp.kp_eproc.e_ppid, true); 
     1001                jobmgr_assumes(jm, jp != NULL); 
     1002                break; 
    9931003        } 
    9941004 
     
    10041014                jr->anonymous = true; 
    10051015                jr->p = anonpid; 
     1016 
    10061017                /* anonymous process reaping is messy */ 
    10071018                LIST_INSERT_HEAD(&jm->active_jobs[ACTIVE_JOB_HASH(jr->p)], jr, pid_hash_sle); 
    10081019                job_assumes(jr, kevent_mod(jr->p, EVFILT_PROC, EV_ADD, proc_fflags, 0, root_jobmgr) != -1); 
     1020 
     1021                if (jp) { 
     1022                        job_assumes(jr, mspolicy_copy(jr, jp)); 
     1023                } 
     1024 
    10091025                if (shutdown_state && jm->hopefully_first_cnt == 0) { 
    1010                         job_log(jr, LOG_APPLEONLY, "This process showed up to the party while all the guests were leaving. Odds are that it will have a miserable time. Blame PID %u: %s", 
    1011                                 kp.kp_eproc.e_ppid, ppid_kp.kp_proc.p_comm); 
    1012                 } 
    1013                 job_log(jr, LOG_DEBUG, "Created anonymously by PPID %u: %s", kp.kp_eproc.e_ppid, ppid_kp.kp_proc.p_comm); 
     1026                        job_log(jr, LOG_APPLEONLY, "This process showed up to the party while all the guests were leaving. Odds are that it will have a miserable time."); 
     1027                } 
     1028 
     1029                job_log(jr, LOG_DEBUG, "Created anonymously by PPID %u%s%s", kp.kp_eproc.e_ppid, jp ? ": " : "", jp ? jp->label : ""); 
    10141030        } 
    10151031 
     
    55735589                job_log(j, LOG_DEBUG, "Setting policy on job \"%s\" for Mach service: %s", target_j->label, target_service); 
    55745590                if (target_service[0]) { 
    5575                         job_assumes(j, mspolicy_new(target_j, target_service, flags & BOOTSTRAP_ALLOW_LOOKUP, flags & BOOTSTRAP_PER_PID_SERVICE)); 
     5591                        job_assumes(j, mspolicy_new(target_j, target_service, flags & BOOTSTRAP_ALLOW_LOOKUP, flags & BOOTSTRAP_PER_PID_SERVICE, false)); 
    55765592                } else { 
    55775593                        target_j->deny_unknown_mslookups = !(flags & BOOTSTRAP_ALLOW_LOOKUP); 
     
    57105726 
    57115727bool 
    5712 mspolicy_new(job_t j, const char *name, bool allow, bool pid_local) 
     5728mspolicy_copy(job_t j_to, job_t j_from) 
    57135729{ 
    57145730        struct mspolicy *msp; 
    57155731 
    5716         SLIST_FOREACH(msp, &j->mspolicies, sle) { 
     5732        SLIST_FOREACH(msp, &j_from->mspolicies, sle) { 
     5733                if (!mspolicy_new(j_to, msp->name, msp->allow, msp->per_pid, true)) { 
     5734                        return false; 
     5735                } 
     5736        } 
     5737 
     5738        return true; 
     5739} 
     5740 
     5741bool 
     5742mspolicy_new(job_t j, const char *name, bool allow, bool pid_local, bool skip_check) 
     5743{ 
     5744        struct mspolicy *msp; 
     5745 
     5746        if (!skip_check) SLIST_FOREACH(msp, &j->mspolicies, sle) { 
    57175747                if (msp->per_pid != pid_local) { 
    57185748                        continue; 
     
    57285758        strcpy((char *)msp->name, name); 
    57295759        msp->per_pid = pid_local; 
     5760        msp->allow = allow; 
    57305761 
    57315762        SLIST_INSERT_HEAD(&j->mspolicies, msp, sle); 
     
    57445775        } 
    57455776 
    5746         job_assumes(j, mspolicy_new(j, key, launch_data_get_bool(obj), false)); 
     5777        job_assumes(j, mspolicy_new(j, key, launch_data_get_bool(obj), false, false)); 
    57475778} 
    57485779