diff options
Diffstat (limited to 'security/ipe/policy_parser.c')
-rw-r--r-- | security/ipe/policy_parser.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/security/ipe/policy_parser.c b/security/ipe/policy_parser.c index 0926b442e32a..67e3fc48f7a6 100644 --- a/security/ipe/policy_parser.c +++ b/security/ipe/policy_parser.c @@ -270,13 +270,19 @@ static enum ipe_action_type parse_action(char *t) return match_token(t, action_tokens, args); } +static const match_table_t property_tokens = { + {IPE_PROP_BOOT_VERIFIED_FALSE, "boot_verified=FALSE"}, + {IPE_PROP_BOOT_VERIFIED_TRUE, "boot_verified=TRUE"}, + {IPE_PROP_INVALID, NULL} +}; + /** * parse_property() - Parse a rule property given a token string. * @t: Supplies the token string to be parsed. * @r: Supplies the ipe_rule the parsed property will be associated with. * - * This is a placeholder. The actual function will be introduced in the - * latter commits. + * This function parses and associates a property with an IPE rule based + * on a token string. * * Return: * * %0 - Success @@ -285,7 +291,34 @@ static enum ipe_action_type parse_action(char *t) */ static int parse_property(char *t, struct ipe_rule *r) { - return -EBADMSG; + substring_t args[MAX_OPT_ARGS]; + struct ipe_prop *p = NULL; + int rc = 0; + int token; + + p = kzalloc(sizeof(*p), GFP_KERNEL); + if (!p) + return -ENOMEM; + + token = match_token(t, property_tokens, args); + + switch (token) { + case IPE_PROP_BOOT_VERIFIED_FALSE: + case IPE_PROP_BOOT_VERIFIED_TRUE: + p->type = token; + break; + default: + rc = -EBADMSG; + break; + } + if (rc) + goto err; + list_add_tail(&p->next, &r->props); + + return rc; +err: + kfree(p); + return rc; } /** |