OSDN Git Service

Merge branch 'next' of git://git.infradead.org/users/pcmoore/selinux into next
authorJames Morris <james.l.morris@oracle.com>
Mon, 26 May 2014 12:38:46 +0000 (22:38 +1000)
committerJames Morris <james.l.morris@oracle.com>
Mon, 26 May 2014 12:38:46 +0000 (22:38 +1000)
1  2 
security/selinux/hooks.c

diff --combined security/selinux/hooks.c
@@@ -106,7 -106,7 +106,7 @@@ int selinux_enforcing
  static int __init enforcing_setup(char *str)
  {
        unsigned long enforcing;
 -      if (!strict_strtoul(str, 0, &enforcing))
 +      if (!kstrtoul(str, 0, &enforcing))
                selinux_enforcing = enforcing ? 1 : 0;
        return 1;
  }
@@@ -119,7 -119,7 +119,7 @@@ int selinux_enabled = CONFIG_SECURITY_S
  static int __init selinux_enabled_setup(char *str)
  {
        unsigned long enabled;
 -      if (!strict_strtoul(str, 0, &enabled))
 +      if (!kstrtoul(str, 0, &enabled))
                selinux_enabled = enabled ? 1 : 0;
        return 1;
  }
@@@ -2123,11 -2123,13 +2123,13 @@@ static int selinux_bprm_set_creds(struc
                new_tsec->exec_sid = 0;
  
                /*
-                * Minimize confusion: if no_new_privs and a transition is
-                * explicitly requested, then fail the exec.
+                * Minimize confusion: if no_new_privs or nosuid and a
+                * transition is explicitly requested, then fail the exec.
                 */
                if (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS)
                        return -EPERM;
+               if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)
+                       return -EACCES;
        } else {
                /* Check for a default transition on this program. */
                rc = security_transition_sid(old_tsec->sid, isec->sid,
@@@ -2770,6 -2772,7 +2772,7 @@@ static int selinux_inode_follow_link(st
  
  static noinline int audit_inode_permission(struct inode *inode,
                                           u32 perms, u32 audited, u32 denied,
+                                          int result,
                                           unsigned flags)
  {
        struct common_audit_data ad;
        ad.u.inode = inode;
  
        rc = slow_avc_audit(current_sid(), isec->sid, isec->sclass, perms,
-                           audited, denied, &ad, flags);
+                           audited, denied, result, &ad, flags);
        if (rc)
                return rc;
        return 0;
@@@ -2822,7 -2825,7 +2825,7 @@@ static int selinux_inode_permission(str
        if (likely(!audited))
                return rc;
  
-       rc2 = audit_inode_permission(inode, perms, audited, denied, flags);
+       rc2 = audit_inode_permission(inode, perms, audited, denied, rc, flags);
        if (rc2)
                return rc2;
        return rc;
@@@ -5719,7 -5722,7 +5722,7 @@@ static void selinux_key_free(struct ke
  
  static int selinux_key_permission(key_ref_t key_ref,
                                  const struct cred *cred,
 -                                key_perm_t perm)
 +                                unsigned perm)
  {
        struct key *key;
        struct key_security_struct *ksec;