aboutsummaryrefslogtreecommitdiffstats
path: root/security/integrity/ima/ima_policy.c
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2010-04-20 10:20:54 -0400
committerJames Morris <jmorris@namei.org>2010-04-20 19:58:13 -0400
commit6ccd045630054c99ba1bb35673db12cfcf1eea58 (patch)
treebce41e39722ae178807abe2213fd94e582842bae /security/integrity/ima/ima_policy.c
parenta200005038955057063fc8ea82129ebc785df41c (diff)
ima: handle multiple rules per write
Currently IMA will only accept one rule per write(). This patch allows IMA to accept writes which contain multiple rules but only processes one rule per write. \n is used as the delimiter between rules. IMA will return a short write indicating that it only accepted up to the first \n. This allows simple userspace utilities like cat to be used to load an IMA policy instead of needing a special userspace utility that understood 'one write per rule' Signed-off-by: Eric Paris <eparis@redhat.com> Acked-by: Mimi Zohar <zohar@us.ibm.com> Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security/integrity/ima/ima_policy.c')
-rw-r--r--security/integrity/ima/ima_policy.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c
index 4759d0f99335..49998f90e441 100644
--- a/security/integrity/ima/ima_policy.c
+++ b/security/integrity/ima/ima_policy.c
@@ -261,7 +261,7 @@ static int ima_parse_rule(char *rule, struct ima_measure_rule_entry *entry)
261 ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_INTEGRITY_RULE); 261 ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_INTEGRITY_RULE);
262 262
263 entry->action = -1; 263 entry->action = -1;
264 while ((p = strsep(&rule, " \n")) != NULL) { 264 while ((p = strsep(&rule, " ")) != NULL) {
265 substring_t args[MAX_OPT_ARGS]; 265 substring_t args[MAX_OPT_ARGS];
266 int token; 266 int token;
267 unsigned long lnum; 267 unsigned long lnum;
@@ -269,7 +269,7 @@ static int ima_parse_rule(char *rule, struct ima_measure_rule_entry *entry)
269 if (result < 0) 269 if (result < 0)
270 break; 270 break;
271 if (!*p) 271 if (!*p)
272 continue; 272 break;
273 token = match_token(p, policy_tokens, args); 273 token = match_token(p, policy_tokens, args);
274 switch (token) { 274 switch (token) {
275 case Opt_measure: 275 case Opt_measure:
@@ -373,7 +373,7 @@ static int ima_parse_rule(char *rule, struct ima_measure_rule_entry *entry)
373 if (entry->action == UNKNOWN) 373 if (entry->action == UNKNOWN)
374 result = -EINVAL; 374 result = -EINVAL;
375 375
376 audit_log_format(ab, "res=%d", !result ? 0 : 1); 376 audit_log_format(ab, "res=%d", !!result);
377 audit_log_end(ab); 377 audit_log_end(ab);
378 return result; 378 return result;
379} 379}
@@ -383,13 +383,14 @@ static int ima_parse_rule(char *rule, struct ima_measure_rule_entry *entry)
383 * @rule - ima measurement policy rule 383 * @rule - ima measurement policy rule
384 * 384 *
385 * Uses a mutex to protect the policy list from multiple concurrent writers. 385 * Uses a mutex to protect the policy list from multiple concurrent writers.
386 * Returns 0 on success, an error code on failure. 386 * Returns the length of the rule parsed, an error code on failure
387 */ 387 */
388int ima_parse_add_rule(char *rule) 388ssize_t ima_parse_add_rule(char *rule)
389{ 389{
390 const char *op = "update_policy"; 390 const char *op = "update_policy";
391 char *p;
391 struct ima_measure_rule_entry *entry; 392 struct ima_measure_rule_entry *entry;
392 int result = 0; 393 ssize_t result, len;
393 int audit_info = 0; 394 int audit_info = 0;
394 395
395 /* Prevent installed policy from changing */ 396 /* Prevent installed policy from changing */
@@ -409,8 +410,11 @@ int ima_parse_add_rule(char *rule)
409 410
410 INIT_LIST_HEAD(&entry->list); 411 INIT_LIST_HEAD(&entry->list);
411 412
412 result = ima_parse_rule(rule, entry); 413 p = strsep(&rule, "\n");
414 len = strlen(p) + 1;
415 result = ima_parse_rule(p, entry);
413 if (!result) { 416 if (!result) {
417 result = len;
414 mutex_lock(&ima_measure_mutex); 418 mutex_lock(&ima_measure_mutex);
415 list_add_tail(&entry->list, &measure_policy_rules); 419 list_add_tail(&entry->list, &measure_policy_rules);
416 mutex_unlock(&ima_measure_mutex); 420 mutex_unlock(&ima_measure_mutex);