[apparmor] [PATCH 4/5] Update the parser to support the 'in' keyword for value lists

John Johansen john.johansen at canonical.com
Mon Mar 26 13:03:56 UTC 2012


Signed-off-by: John Johansen <john.johansen at canonical.com>
---
 parser/parser.h                        |    3 ++-
 parser/parser_lex.l                    |   17 +++++++++++++++++
 parser/parser_misc.c                   |    4 +++-
 parser/parser_yacc.y                   |   15 +++++++++++++--
 parser/tst/simple_tests/mount/in_1.sd  |    7 +++++++
 parser/tst/simple_tests/mount/in_1.sd~ |    7 +++++++
 parser/tst/simple_tests/mount/in_2.sd  |    7 +++++++
 parser/tst/simple_tests/mount/in_2.sd~ |    7 +++++++
 parser/tst/simple_tests/mount/in_3.sd  |    7 +++++++
 parser/tst/simple_tests/mount/in_3.sd~ |    7 +++++++
 parser/tst/simple_tests/mount/in_4.sd  |    7 +++++++
 parser/tst/simple_tests/mount/in_4.sd~ |    7 +++++++
 12 files changed, 91 insertions(+), 4 deletions(-)
 create mode 100644 parser/tst/simple_tests/mount/in_1.sd
 create mode 100644 parser/tst/simple_tests/mount/in_1.sd~
 create mode 100644 parser/tst/simple_tests/mount/in_2.sd
 create mode 100644 parser/tst/simple_tests/mount/in_2.sd~
 create mode 100644 parser/tst/simple_tests/mount/in_3.sd
 create mode 100644 parser/tst/simple_tests/mount/in_3.sd~
 create mode 100644 parser/tst/simple_tests/mount/in_4.sd
 create mode 100644 parser/tst/simple_tests/mount/in_4.sd~

diff --git a/parser/parser.h b/parser/parser.h
index 799d44b..fa2d191 100644
--- a/parser/parser.h
+++ b/parser/parser.h
@@ -62,6 +62,7 @@ struct value_list {
 
 struct cond_entry {
 	char *name;
+	int eq;			/* where equals was used in specifying list */
 	struct value_list *vals;
 
 	struct cond_entry *next;
@@ -316,7 +317,7 @@ extern struct value_list *new_value_list(char *value);
 extern struct value_list *dup_value_list(struct value_list *list);
 extern void free_value_list(struct value_list *list);
 extern void print_value_list(struct value_list *list);
-extern struct cond_entry *new_cond_entry(char *name, struct value_list *list);
+extern struct cond_entry *new_cond_entry(char *name, int eq, struct value_list *list);
 extern void free_cond_entry(struct cond_entry *ent);
 extern void print_cond_entry(struct cond_entry *ent);
 extern char *processid(char *string, int len);
diff --git a/parser/parser_lex.l b/parser/parser_lex.l
index b5627ad..7c6cb5d 100644
--- a/parser/parser_lex.l
+++ b/parser/parser_lex.l
@@ -280,6 +280,18 @@ LT_EQUAL	<=
 				yy_push_state(EXTCOND_MODE);
 				return TOK_CONDID;
 			}
+	{VARIABLE_NAME}/{WS}+in{WS}*\(	{
+				/* we match to 'in' in the lexer so that
+				 * we can switch scanner state.  By the time
+				 * the parser see the 'in' it may be to late
+				 * as bison may have requested the next
+				 * token from the scanner
+				 */
+				PDEBUG("conditional %s=\n", yytext);
+				yylval.id = processid(yytext, yyleng);
+				yy_push_state(EXTCOND_MODE);
+				return TOK_CONDID;
+			}
 }
 
 <SUB_ID>{
@@ -384,6 +396,11 @@ LT_EQUAL	<=
 			return TOK_OPENPAREN;
 		}
 
+	in	{
+			DUMP_PREPROCESS;
+			return TOK_IN;
+		}
+
 	[^\n]	{
 			DUMP_PREPROCESS;
 			/* Something we didn't expect */
diff --git a/parser/parser_misc.c b/parser/parser_misc.c
index 7ff6348..9d2fc4b 100644
--- a/parser/parser_misc.c
+++ b/parser/parser_misc.c
@@ -84,6 +84,7 @@ static struct keyword_table keyword_table[] = {
 	{"umount",		TOK_UMOUNT},
 	{"unmount",		TOK_UMOUNT},
 	{"pivot_root",		TOK_PIVOTROOT},
+	{"in",			TOK_IN},
 	/* terminate */
 	{NULL, 0}
 };
@@ -1025,12 +1026,13 @@ void print_value_list(struct value_list *list)
 	}
 }
 
-struct cond_entry *new_cond_entry(char *name, struct value_list *list)
+struct cond_entry *new_cond_entry(char *name, int eq, struct value_list *list)
 {
 	struct cond_entry *ent = calloc(1, sizeof(struct cond_entry));
 	if (ent) {
 		ent->name = name;
 		ent->vals = list;
+		ent->eq = eq;
 	}
 
 	return ent;
diff --git a/parser/parser_yacc.y b/parser/parser_yacc.y
index 65cf365..a79be85 100644
--- a/parser/parser_yacc.y
+++ b/parser/parser_yacc.y
@@ -121,6 +121,7 @@ void add_local_entry(struct codomain *cod);
 %token TOK_REMOUNT
 %token TOK_UMOUNT
 %token TOK_PIVOTROOT
+%token TOK_IN
 
  /* rlimits */
 %token TOK_RLIMIT
@@ -1072,7 +1073,7 @@ cond: TOK_CONDID TOK_EQUALS TOK_VALUE
 		struct value_list *value = new_value_list($3);
 		if (!value)
 			yyerror(_("Memory allocation error."));
-		ent = new_cond_entry($1, value);
+		ent = new_cond_entry($1, 1, value);
 		if (!ent) {
 			free_value_list(value);
 			yyerror(_("Memory allocation error."));
@@ -1082,7 +1083,17 @@ cond: TOK_CONDID TOK_EQUALS TOK_VALUE
 
 cond: TOK_CONDID TOK_EQUALS TOK_OPENPAREN valuelist TOK_CLOSEPAREN
 	{
-		struct cond_entry *ent = new_cond_entry($1, $4);
+		struct cond_entry *ent = new_cond_entry($1, 1, $4);
+
+		if (!ent)
+			yyerror(_("Memory allocation error."));
+		$$ = ent;
+	}
+
+
+cond: TOK_CONDID TOK_IN TOK_OPENPAREN valuelist TOK_CLOSEPAREN
+	{
+		struct cond_entry *ent = new_cond_entry($1, 0, $4);
 
 		if (!ent)
 			yyerror(_("Memory allocation error."));
diff --git a/parser/tst/simple_tests/mount/in_1.sd b/parser/tst/simple_tests/mount/in_1.sd
new file mode 100644
index 0000000..076d5dc
--- /dev/null
+++ b/parser/tst/simple_tests/mount/in_1.sd
@@ -0,0 +1,7 @@
+#
+#=Description basic mount rule
+#=EXRESULT PASS
+#
+/usr/bin/foo {
+  mount options in (rw) -> /foo,
+}
diff --git a/parser/tst/simple_tests/mount/in_1.sd~ b/parser/tst/simple_tests/mount/in_1.sd~
new file mode 100644
index 0000000..3b552f7
--- /dev/null
+++ b/parser/tst/simple_tests/mount/in_1.sd~
@@ -0,0 +1,7 @@
+#
+#=Description basic mount rule
+#=EXRESULT PASS
+#
+/usr/bin/foo {
+  mount options=(rw) -> /foo,
+}
diff --git a/parser/tst/simple_tests/mount/in_2.sd b/parser/tst/simple_tests/mount/in_2.sd
new file mode 100644
index 0000000..5bf4beb
--- /dev/null
+++ b/parser/tst/simple_tests/mount/in_2.sd
@@ -0,0 +1,7 @@
+#
+#=Description basic mount rule
+#=EXRESULT PASS
+#
+/usr/bin/foo {
+  mount options in (rw, ro) -> /foo,
+}
diff --git a/parser/tst/simple_tests/mount/in_2.sd~ b/parser/tst/simple_tests/mount/in_2.sd~
new file mode 100644
index 0000000..12c21aa
--- /dev/null
+++ b/parser/tst/simple_tests/mount/in_2.sd~
@@ -0,0 +1,7 @@
+#
+#=Description basic mount rule
+#=EXRESULT PASS
+#
+/usr/bin/foo {
+  mount options=(rw, ro) -> /foo,
+}
diff --git a/parser/tst/simple_tests/mount/in_3.sd b/parser/tst/simple_tests/mount/in_3.sd
new file mode 100644
index 0000000..cd5bae5
--- /dev/null
+++ b/parser/tst/simple_tests/mount/in_3.sd
@@ -0,0 +1,7 @@
+#
+#=Description basic mount rule
+#=EXRESULT PASS
+#
+/usr/bin/foo {
+  mount options in (rw ro) -> /foo,
+}
diff --git a/parser/tst/simple_tests/mount/in_3.sd~ b/parser/tst/simple_tests/mount/in_3.sd~
new file mode 100644
index 0000000..08aa1bb
--- /dev/null
+++ b/parser/tst/simple_tests/mount/in_3.sd~
@@ -0,0 +1,7 @@
+#
+#=Description basic mount rule
+#=EXRESULT PASS
+#
+/usr/bin/foo {
+  mount options=(rw ro) -> /foo,
+}
diff --git a/parser/tst/simple_tests/mount/in_4.sd b/parser/tst/simple_tests/mount/in_4.sd
new file mode 100644
index 0000000..8acaa88
--- /dev/null
+++ b/parser/tst/simple_tests/mount/in_4.sd
@@ -0,0 +1,7 @@
+#
+#=Description basic mount rule
+#=EXRESULT PASS
+#
+/usr/bin/foo {
+  mount options in (rw ro) fstype=procfs -> /foo,
+}
diff --git a/parser/tst/simple_tests/mount/in_4.sd~ b/parser/tst/simple_tests/mount/in_4.sd~
new file mode 100644
index 0000000..96a93a2
--- /dev/null
+++ b/parser/tst/simple_tests/mount/in_4.sd~
@@ -0,0 +1,7 @@
+#
+#=Description basic mount rule
+#=EXRESULT PASS
+#
+/usr/bin/foo {
+  mount options=(rw ro) fstype=procfs -> /foo,
+}
-- 
1.7.9.1




More information about the AppArmor mailing list