]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/kern/kern_credential.c
xnu-1228.12.14.tar.gz
[apple/xnu.git] / bsd / kern / kern_credential.c
index 89d2e8dbf2ddfc777cd164b00cf685d5e6ed61bf..c7b4ca7a896f360961f6fc781eded5d1766ff6fd 100644 (file)
@@ -3239,9 +3239,15 @@ kauth_cred_label_update(kauth_cred_t cred, struct label *label)
  *             vp                              The exec vnode
  *             scriptl                         The script MAC label
  *             execl                           The executable MAC label
+ *             disjointp                       Pointer to flag to set if old
+ *                                             and returned credentials are
+ *                                             disjoint
  *
  * Returns:    (kauth_cred_t)                  The updated credential
  *
+ * Implicit returns:
+ *             *disjointp                      Set to 1 for disjoint creds
+ *
  * IMPORTANT:  This function is implemented via kauth_cred_update(), which,
  *             if it returns a credential other than the one it is passed,
  *             will have dropped the reference on the passed credential.  All
@@ -3257,7 +3263,8 @@ kauth_cred_label_update(kauth_cred_t cred, struct label *label)
 static
 kauth_cred_t
 kauth_cred_label_update_execve(kauth_cred_t cred, vfs_context_t ctx,
-       struct vnode *vp, struct label *scriptl, struct label *execl)
+       struct vnode *vp, struct label *scriptl, struct label *execl,
+       int *disjointp)
 {
        kauth_cred_t newcred;
        struct ucred temp_cred;
@@ -3266,8 +3273,8 @@ kauth_cred_label_update_execve(kauth_cred_t cred, vfs_context_t ctx,
 
        mac_cred_label_init(&temp_cred);
        mac_cred_label_associate(cred, &temp_cred);
-       mac_cred_label_update_execve(ctx, &temp_cred, 
-                                    vp, scriptl, execl);
+       *disjointp = mac_cred_label_update_execve(ctx, &temp_cred, 
+                                                    vp, scriptl, execl);
 
        newcred = kauth_cred_update(cred, &temp_cred, TRUE);
        mac_cred_label_destroy(&temp_cred);
@@ -3349,14 +3356,21 @@ int kauth_proc_label_update(struct proc *p, struct label *label)
  *             scriptl                 The script MAC label
  *             execl                   The executable MAC label
  *
+ * Returns:    0                       Label update did not make credential
+ *                                     disjoint
+ *             1                       Label update caused credential to be
+ *                                     disjoint
+ *
  * Notes:      The credential associated with the process WILL change as a
  *             result of this call.  The caller should not assume the process
  *             reference to the old credential still exists.
  */
-int kauth_proc_label_update_execve(struct proc *p, vfs_context_t ctx,
+int
+kauth_proc_label_update_execve(struct proc *p, vfs_context_t ctx,
        struct vnode *vp, struct label *scriptl, struct label *execl)
 {
        kauth_cred_t my_cred, my_new_cred;
+       int disjoint = 0;
 
        my_cred = kauth_cred_proc_ref(p);
 
@@ -3372,7 +3386,7 @@ int kauth_proc_label_update_execve(struct proc *p, vfs_context_t ctx,
                 * passed in.  The subsequent compare is safe, because it is
                 * a pointer compare rather than a contents compare.
                 */
-               my_new_cred = kauth_cred_label_update_execve(my_cred, ctx, vp, scriptl, execl);
+               my_new_cred = kauth_cred_label_update_execve(my_cred, ctx, vp, scriptl, execl, &disjoint);
                if (my_cred != my_new_cred) {
 
                        DEBUG_CRED_CHANGE("kauth_proc_label_update_execve_unlocked CH(%d): %p/0x%08x -> %p/0x%08x\n", p->p_pid, my_cred, my_cred->cr_flags, my_new_cred, my_new_cred->cr_flags);
@@ -3400,7 +3414,7 @@ int kauth_proc_label_update_execve(struct proc *p, vfs_context_t ctx,
        /* Drop old proc reference or our extra reference */
        kauth_cred_unref(&my_cred);
        
-       return (0);
+       return (disjoint);
 }
 
 #if 1