selinux: revert "stop passing MAY_NOT_BLOCK to the AVC upon follow_link"
[platform/kernel/linux-rpi.git] / security / selinux / avc.c
index ecd3829..74c43eb 100644 (file)
@@ -862,8 +862,9 @@ static int avc_update_node(struct selinux_avc *avc,
         * permissive mode that only appear when in enforcing mode.
         *
         * See the corresponding handling in slow_avc_audit(), and the
-        * logic in selinux_inode_permission for the MAY_NOT_BLOCK flag,
-        * which is transliterated into AVC_NONBLOCKING.
+        * logic in selinux_inode_follow_link and selinux_inode_permission
+        * for the VFS MAY_NOT_BLOCK flag, which is transliterated into
+        * AVC_NONBLOCKING for avc_has_perm_noaudit().
         */
        if (flags & AVC_NONBLOCKING)
                return 0;
@@ -1205,6 +1206,25 @@ int avc_has_perm(struct selinux_state *state, u32 ssid, u32 tsid, u16 tclass,
        return rc;
 }
 
+int avc_has_perm_flags(struct selinux_state *state,
+                      u32 ssid, u32 tsid, u16 tclass, u32 requested,
+                      struct common_audit_data *auditdata,
+                      int flags)
+{
+       struct av_decision avd;
+       int rc, rc2;
+
+       rc = avc_has_perm_noaudit(state, ssid, tsid, tclass, requested,
+                                 (flags & MAY_NOT_BLOCK) ? AVC_NONBLOCKING : 0,
+                                 &avd);
+
+       rc2 = avc_audit(state, ssid, tsid, tclass, requested, &avd, rc,
+                       auditdata, flags);
+       if (rc2)
+               return rc2;
+       return rc;
+}
+
 u32 avc_policy_seqno(struct selinux_state *state)
 {
        return state->avc->avc_cache.latest_notif;