[apparmor] [patch 04/16] make the parse_sub_mode code more generic

john.johansen at canonical.com john.johansen at canonical.com
Tue Feb 25 23:12:47 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