ima: update appraise flags after policy update completes
authorMimi Zohar <zohar@linux.vnet.ibm.com>
Mon, 7 Dec 2015 19:35:47 +0000 (14:35 -0500)
committerMimi Zohar <zohar@linux.vnet.ibm.com>
Tue, 15 Dec 2015 15:01:43 +0000 (10:01 -0500)
While creating a temporary list of new rules, the ima_appraise flag is
updated, but not reverted on failure to append the new rules to the
existing policy.  This patch defines temp_ima_appraise flag.  Only when
the new rules are appended to the policy is the flag updated.

Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
Acked-by: Petko Manolov <petkan@mip-labs.com>
security/integrity/ima/ima_policy.c

index 2f4e0f5f31e282610b25a408cedb93f957a6628c..ba5d2fc613940ec3357d4f5a0feb56558b159223 100644 (file)
@@ -40,6 +40,7 @@
 #define AUDIT          0x0040
 
 int ima_policy_flag;
+static int temp_ima_appraise;
 
 #define MAX_LSM_RULES 6
 enum lsm_rule_types { LSM_OBJ_USER, LSM_OBJ_ROLE, LSM_OBJ_TYPE,
@@ -370,6 +371,7 @@ void ima_update_policy_flag(void)
                        ima_policy_flag |= entry->action;
        }
 
+       ima_appraise |= temp_ima_appraise;
        if (!ima_appraise)
                ima_policy_flag &= ~IMA_APPRAISE;
 }
@@ -757,9 +759,9 @@ static int ima_parse_rule(char *rule, struct ima_rule_entry *entry)
        if (!result && (entry->action == UNKNOWN))
                result = -EINVAL;
        else if (entry->func == MODULE_CHECK)
-               ima_appraise |= IMA_APPRAISE_MODULES;
+               temp_ima_appraise |= IMA_APPRAISE_MODULES;
        else if (entry->func == FIRMWARE_CHECK)
-               ima_appraise |= IMA_APPRAISE_FIRMWARE;
+               temp_ima_appraise |= IMA_APPRAISE_FIRMWARE;
        audit_log_format(ab, "res=%d", !result);
        audit_log_end(ab);
        return result;
@@ -821,6 +823,7 @@ void ima_delete_rules(void)
        struct ima_rule_entry *entry, *tmp;
        int i;
 
+       temp_ima_appraise = 0;
        list_for_each_entry_safe(entry, tmp, &ima_temp_rules, list) {
                for (i = 0; i < MAX_LSM_RULES; i++)
                        kfree(entry->lsm[i].args_p);