Make it more generic so that it can be shared with signals. Signed-off-by: John Johansen <john.johan...@canonical.com>
--- parser/dbus.c | 71 ------------------------------------------------ parser/parser.h | 1 parser/parser_misc.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 70 deletions(-) --- 2.9-test.orig/parser/dbus.c +++ 2.9-test/parser/dbus.c @@ -31,79 +31,10 @@ #define _(s) gettext(s) -static int parse_dbus_sub_mode(const char *str_mode, int *result, int fail, const char *mode_desc __unused) -{ - int mode = 0; - const char *p; - - PDEBUG("Parsing DBus mode: %s\n", str_mode); - - if (!str_mode) - return 0; - - p = str_mode; - while (*p) { - char current = *p; - char lower; - -reeval: - switch (current) { - case COD_READ_CHAR: - PDEBUG("Parsing DBus mode: found %s READ\n", mode_desc); - mode |= AA_DBUS_RECEIVE; - break; - - case COD_WRITE_CHAR: - PDEBUG("Parsing DBus mode: found %s WRITE\n", - mode_desc); - mode |= AA_DBUS_SEND; - break; - - /* error cases */ - - default: - lower = tolower(current); - switch (lower) { - case COD_READ_CHAR: - case COD_WRITE_CHAR: - PDEBUG("Parsing DBus mode: found invalid upper case char %c\n", - current); - warn_uppercase(); - current = lower; - goto reeval; - break; - default: - if (fail) - yyerror(_("Internal: unexpected DBus mode character '%c' in input"), - current); - else - return 0; - break; - } - break; - } - p++; - } - - PDEBUG("Parsed DBus mode: %s 0x%x\n", str_mode, mode); - - *result = mode; - return 1; -} int parse_dbus_mode(const char *str_mode, int *mode, int fail) { - *mode = 0; - if (!parse_dbus_sub_mode(str_mode, mode, fail, "")) - return 0; - if (*mode & ~AA_VALID_DBUS_PERMS) { - if (fail) - yyerror(_("Internal error generated invalid DBus perm 0x%x\n"), - mode); - else - return 0; - } - return 1; + return parse_X_mode("DBus", AA_VALID_DBUS_PERMS, str_mode, mode, fail); } static void move_conditional_value(char **dst_ptr, struct cond_entry *cond_ent) --- 2.9-test.orig/parser/parser.h +++ 2.9-test/parser/parser.h @@ -331,6 +331,7 @@ extern int get_rlimit(const char *name); extern char *process_var(const char *var); extern int parse_mode(const char *mode); +extern int parse_X_mode(const char *X, int valid, const char *str_mode, int *mode, int fail); extern struct cod_entry *new_entry(char *ns, char *id, int mode, char *link_id); extern struct aa_network_entry *new_network_ent(unsigned int family, unsigned int type, --- 2.9-test.orig/parser/parser_misc.c +++ 2.9-test/parser/parser_misc.c @@ -792,6 +792,81 @@ return mode; } +static int parse_X_sub_mode(const char *X, const char *str_mode, int *result, int fail, const char *mode_desc __unused) +{ + int mode = 0; + const char *p; + + PDEBUG("Parsing X mode: %s\n", X, str_mode); + + if (!str_mode) + return 0; + + p = str_mode; + while (*p) { + char current = *p; + char lower; + +reeval: + switch (current) { + case COD_READ_CHAR: + PDEBUG("Parsing %s mode: found %s READ\n", X, mode_desc); + mode |= AA_DBUS_RECEIVE; + break; + + case COD_WRITE_CHAR: + PDEBUG("Parsing %s mode: found %s WRITE\n", X, + mode_desc); + mode |= AA_DBUS_SEND; + break; + + /* error cases */ + + default: + lower = tolower(current); + switch (lower) { + case COD_READ_CHAR: + case COD_WRITE_CHAR: + PDEBUG("Parsing %s mode: found invalid upper case char %c\n", + X, current); + warn_uppercase(); + current = lower; + goto reeval; + break; + default: + if (fail) + yyerror(_("Internal: unexpected %s mode character '%c' in input"), + X, current); + else + return 0; + break; + } + break; + } + p++; + } + + PDEBUG("Parsed %s mode: %s 0x%x\n", X, str_mode, mode); + + *result = mode; + return 1; +} + +int parse_X_mode(const char *X, int valid, const char *str_mode, int *mode, int fail) +{ + *mode = 0; + if (!parse_X_sub_mode(X, str_mode, mode, fail, "")) + return 0; + if (*mode & ~valid) { + if (fail) + yyerror(_("Internal error generated invalid %s perm 0x%x\n"), + X, mode); + else + return 0; + } + return 1; +} + struct cod_entry *new_entry(char *ns, char *id, int mode, char *link_id) { struct cod_entry *entry = NULL; -- AppArmor mailing list AppArmor@lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor