[apparmor] [patch 04/24] make the parse_sub_mode code more generic
john.johansen at canonical.com
john.johansen at canonical.com
Fri Mar 7 17:31:25 UTC 2014
Make it more generic so that it can be shared with signals.
Signed-off-by: John Johansen <john.johansen at 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;
More information about the AppArmor
mailing list