[apparmor] [Patch][parser] fix: globbing for af_unix abstract names

John Johansen john.johansen at canonical.com
Mon Feb 2 21:28:55 UTC 2015


On 01/30/2015 03:14 PM, John Johansen wrote:

v2. per Christian's request on IRC grouping of the glob switch into a single fn

=== modified file 'parser/af_unix.cc'
--- parser/af_unix.cc	2014-10-08 20:20:20 +0000
+++ parser/af_unix.cc	2015-01-30 17:46:36 +0000
@@ -243,7 +243,7 @@
 			buffer << "\\x01";
 		} else {
 			/* skip leading @ */
-			ptype = convert_aaregex_to_pcre(addr + 1, 0, buf, &pos);
+			ptype = convert_aaregex_to_pcre(addr + 1, 0, glob_null, buf, &pos);
 			if (ptype == ePatternInvalid)
 				return false;
 			/* kernel starts abstract with \0 */
@@ -267,7 +267,7 @@
 
 	if (label) {
 		int pos;
-		ptype = convert_aaregex_to_pcre(label, 0, buf, &pos);
+		ptype = convert_aaregex_to_pcre(label, 0, glob_default, buf, &pos);
 		if (ptype == ePatternInvalid)
 			return false;
 		/* kernel starts abstract with \0 */

=== modified file 'parser/dbus.cc'
--- parser/dbus.cc	2014-10-08 20:20:20 +0000
+++ parser/dbus.cc	2015-01-30 17:47:35 +0000
@@ -228,7 +228,7 @@
 	busbuf.append(buffer.str());
 
 	if (bus) {
-		ptype = convert_aaregex_to_pcre(bus, 0, busbuf, &pos);
+		ptype = convert_aaregex_to_pcre(bus, 0, glob_default, busbuf, &pos);
 		if (ptype == ePatternInvalid)
 			goto fail;
 	} else {
@@ -238,7 +238,7 @@
 	vec[0] = busbuf.c_str();
 
 	if (name) {
-		ptype = convert_aaregex_to_pcre(name, 0, namebuf, &pos);
+		ptype = convert_aaregex_to_pcre(name, 0, glob_default, namebuf, &pos);
 		if (ptype == ePatternInvalid)
 			goto fail;
 		vec[1] = namebuf.c_str();
@@ -248,7 +248,7 @@
 	}
 
 	if (peer_label) {
-		ptype = convert_aaregex_to_pcre(peer_label, 0,
+		ptype = convert_aaregex_to_pcre(peer_label, 0, glob_default,
 						peer_labelbuf, &pos);
 		if (ptype == ePatternInvalid)
 			goto fail;
@@ -259,7 +259,7 @@
 	}
 
 	if (path) {
-		ptype = convert_aaregex_to_pcre(path, 0, pathbuf, &pos);
+		ptype = convert_aaregex_to_pcre(path, 0, glob_default, pathbuf, &pos);
 		if (ptype == ePatternInvalid)
 			goto fail;
 		vec[3] = pathbuf.c_str();
@@ -269,7 +269,7 @@
 	}
 
 	if (interface) {
-		ptype = convert_aaregex_to_pcre(interface, 0, ifacebuf, &pos);
+		ptype = convert_aaregex_to_pcre(interface, 0, glob_default, ifacebuf, &pos);
 		if (ptype == ePatternInvalid)
 			goto fail;
 		vec[4] = ifacebuf.c_str();
@@ -279,7 +279,7 @@
 	}
 
 	if (member) {
-		ptype = convert_aaregex_to_pcre(member, 0, memberbuf, &pos);
+		ptype = convert_aaregex_to_pcre(member, 0, glob_default, memberbuf, &pos);
 		if (ptype == ePatternInvalid)
 			goto fail;
 		vec[5] = memberbuf.c_str();

=== modified file 'parser/mount.cc'
--- parser/mount.cc	2014-12-12 14:21:31 +0000
+++ parser/mount.cc	2015-01-30 17:47:53 +0000
@@ -554,7 +554,7 @@
 	}
 
 	list_for_each(opts, ent) {
-		ptype = convert_aaregex_to_pcre(ent->value, 0, buffer, &pos);
+		ptype = convert_aaregex_to_pcre(ent->value, 0, glob_default, buffer, &pos);
 		if (ptype == ePatternInvalid)
 			return FALSE;
 

=== modified file 'parser/parser.h'
--- parser/parser.h	2014-10-08 20:20:20 +0000
+++ parser/parser.h	2015-01-30 17:50:02 +0000
@@ -334,7 +334,9 @@
 #define default_match_pattern "[^\\000]*"
 #define anyone_match_pattern "[^\\000]+"
 
-extern pattern_t convert_aaregex_to_pcre(const char *aare, int anchor,
+#define glob_default	0
+#define glob_null	1
+extern pattern_t convert_aaregex_to_pcre(const char *aare, int anchor, int glob,
 					 std::string& pcre, int *first_re_pos);
 extern int build_list_val_expr(std::string& buffer, struct value_list *list);
 extern int convert_entry(std::string& buffer, char *entry);

=== modified file 'parser/parser_regex.c'
--- parser/parser_regex.c	2015-01-29 22:54:08 +0000
+++ parser/parser_regex.c	2015-02-02 21:22:08 +0000
@@ -84,9 +84,27 @@
 	*dptr = 0;
 }
 
+static error_type append_glob(std::string &pcre, int glob,
+			      const char *default_glob, const char *null_glob)
+{
+	switch (glob) {
+	case glob_default:
+		pcre.append(default_glob);
+		break;
+	case glob_null:
+		pcre.append(null_glob);
+		break;
+	default:
+		PERROR(_("%s: Invalid glob type %d\n"), progname, glob);
+		return e_parse_error;
+		break;
+	}
+	return e_no_error;
+}
+
 /* converts the apparmor regex in aare and appends pcre regex output
  * to pcre string */
-pattern_t convert_aaregex_to_pcre(const char *aare, int anchor,
+pattern_t convert_aaregex_to_pcre(const char *aare, int anchor, int glob,
 				  std::string& pcre, int *first_re_pos)
 {
 #define update_re_pos(X) if (!(*first_re_pos)) { *first_re_pos = (X); }
@@ -171,9 +189,8 @@
 					const char *s = sptr;
 					while (*s == '*')
 						s++;
-					if (*s == '/' || !*s) {
-						pcre.append("[^/\\x00]");
-					}
+					if (*s == '/' || !*s)
+						error = append_glob(pcre, glob, "[^/\\x00]", "[^/]");
 				}
 				if (*(sptr + 1) == '*') {
 					/* is this the first regex form we
@@ -189,13 +206,12 @@
 					} else {
 						ptype = ePatternRegex;
 					}
-
-					pcre.append("[^\\x00]*");
+					error = append_glob(pcre, glob, "[^\\x00]*", ".*");
 					sptr++;
 				} else {
 					update_re_pos(sptr - aare);
 					ptype = ePatternRegex;
-					pcre.append("[^/\\x00]*");
+					error = append_glob(pcre, glob, "[^/\\x00]*", "[^/]*");
 				}	/* *(sptr+1) == '*' */
 			}	/* bEscape */
 
@@ -427,7 +443,7 @@
 		name = prof->attachment;
 	else
 		name = local_name(prof->name);
-	ptype = convert_aaregex_to_pcre(name, 0, tbuf,
+	ptype = convert_aaregex_to_pcre(name, 0, glob_default, tbuf,
 					&prof->xmatch_len);
 	if (ptype == ePatternBasic)
 		prof->xmatch_len = strlen(name);
@@ -455,8 +471,8 @@
 				int len;
 				tbuf.clear();
 				ptype = convert_aaregex_to_pcre(alt->name, 0,
-								tbuf,
-								&len);
+								glob_default,
+								tbuf, &len);
 				if (ptype == ePatternBasic)
 					len = strlen(alt->name);
 				if (len < prof->xmatch_len)
@@ -488,7 +504,7 @@
 
 	if (entry->mode & ~AA_CHANGE_PROFILE)
 		filter_slashes(entry->name);
-	ptype = convert_aaregex_to_pcre(entry->name, 0, tbuf, &pos);
+	ptype = convert_aaregex_to_pcre(entry->name, 0, glob_default, tbuf, &pos);
 	if (ptype == ePatternInvalid)
 		return FALSE;
 
@@ -526,7 +542,7 @@
 		int pos;
 		vec[0] = tbuf.c_str();
 		if (entry->link_name) {
-			ptype = convert_aaregex_to_pcre(entry->link_name, 0, lbuf, &pos);
+			ptype = convert_aaregex_to_pcre(entry->link_name, 0, glob_default, lbuf, &pos);
 			if (ptype == ePatternInvalid)
 				return FALSE;
 			if (entry->subset)
@@ -549,7 +565,7 @@
 
 		if (entry->ns) {
 			int pos;
-			ptype = convert_aaregex_to_pcre(entry->ns, 0, lbuf, &pos);
+			ptype = convert_aaregex_to_pcre(entry->ns, 0, glob_default, lbuf, &pos);
 			vec[index++] = lbuf.c_str();
 		}
 		vec[index++] = tbuf.c_str();
@@ -631,13 +647,13 @@
 
 	buffer.append("(");
 
-	ptype = convert_aaregex_to_pcre(list->value, 0, buffer, &pos);
+	ptype = convert_aaregex_to_pcre(list->value, 0, glob_default, buffer, &pos);
 	if (ptype == ePatternInvalid)
 		goto fail;
 
 	list_for_each(list->next, ent) {
 		buffer.append("|");
-		ptype = convert_aaregex_to_pcre(ent->value, 0, buffer, &pos);
+		ptype = convert_aaregex_to_pcre(ent->value, 0, glob_default, buffer, &pos);
 		if (ptype == ePatternInvalid)
 			goto fail;
 	}
@@ -654,7 +670,7 @@
 	int pos;
 
 	if (entry) {
-		ptype = convert_aaregex_to_pcre(entry, 0, buffer, &pos);
+		ptype = convert_aaregex_to_pcre(entry, 0, glob_default, buffer, &pos);
 		if (ptype == ePatternInvalid)
 			return FALSE;
 	} else {
@@ -805,7 +821,7 @@
 	return rc;
 }
 
-#define MY_REGEX_TEST(input, expected_str, expected_type)						\
+#define MY_REGEX_EXT_TEST(glob, input, expected_str, expected_type)	\
 	do {												\
 		std::string tbuf;									\
 		std::string tbuf2 = "testprefix";							\
@@ -814,7 +830,7 @@
 		pattern_t ptype;									\
 		int pos;										\
 													\
-		ptype = convert_aaregex_to_pcre((input), 0, tbuf, &pos);				\
+		ptype = convert_aaregex_to_pcre((input), 0, glob, tbuf, &pos); \
 		asprintf(&output_string, "simple regex conversion for '%s'\texpected = '%s'\tresult = '%s'", \
 				(input), (expected_str), tbuf.c_str());					\
 		MY_TEST(strcmp(tbuf.c_str(), (expected_str)) == 0, output_string);			\
@@ -823,21 +839,25 @@
 		/* ensure convert_aaregex_to_pcre appends only to passed ref string */			\
 		expected_str2 = tbuf2;									\
 		expected_str2.append((expected_str));							\
-		ptype = convert_aaregex_to_pcre((input), 0, tbuf2, &pos);				\
-		asprintf(&output_string, "simple regex conversion for '%s'\texpected = '%s'\tresult = '%s'", \
+		ptype = convert_aaregex_to_pcre((input), 0, glob, tbuf2, &pos); \
+		asprintf(&output_string, "simple regex conversion %sfor '%s'\texpected = '%s'\tresult = '%s'", \
+			 glob == glob_null ? "with null allowed in glob " : "",\
 				(input), expected_str2.c_str(), tbuf2.c_str());				\
 		MY_TEST((tbuf2 == expected_str2), output_string);					\
 		free(output_string);									\
 	}												\
 	while (0)
 
+#define MY_REGEX_TEST(input, expected_str, expected_type) MY_REGEX_EXT_TEST(glob_default, input, expected_str, expected_type)
+
+
 #define MY_REGEX_FAIL_TEST(input)						\
 	do {												\
 		std::string tbuf;									\
 		pattern_t ptype;									\
 		int pos;										\
 													\
-		ptype = convert_aaregex_to_pcre((input), 0, tbuf, &pos);				\
+		ptype = convert_aaregex_to_pcre((input), 0, glob_default, tbuf, &pos); \
 		MY_TEST(ptype == ePatternInvalid, "simple regex conversion invalid type check for '" input "'"); \
 	}												\
 	while (0)
@@ -958,6 +978,27 @@
 	MY_REGEX_TEST("{alpha,b[\\{a,b\\}]t,gamma}", "(alpha|b[\\{a,b\\}]t|gamma)", ePatternRegex);
 	MY_REGEX_TEST("{alpha,b[\\{a\\,b\\}]t,gamma}", "(alpha|b[\\{a\\,b\\}]t|gamma)", ePatternRegex);
 
+	/* test different globbing behavior conversion */
+	MY_REGEX_EXT_TEST(glob_default, "/foo/**", "/foo/[^/\\x00][^\\x00]*", ePatternTailGlob);
+	MY_REGEX_EXT_TEST(glob_null, "/foo/**", "/foo/[^/].*", ePatternTailGlob);
+	MY_REGEX_EXT_TEST(glob_default, "/foo/f**", "/foo/f[^\\x00]*", ePatternTailGlob);
+	MY_REGEX_EXT_TEST(glob_null, "/foo/f**", "/foo/f.*", ePatternTailGlob);
+
+	MY_REGEX_EXT_TEST(glob_default, "/foo/*", "/foo/[^/\\x00][^/\\x00]*", ePatternRegex);
+	MY_REGEX_EXT_TEST(glob_null, "/foo/*", "/foo/[^/][^/]*", ePatternRegex);
+	MY_REGEX_EXT_TEST(glob_default, "/foo/f*", "/foo/f[^/\\x00]*", ePatternRegex);
+	MY_REGEX_EXT_TEST(glob_null, "/foo/f*", "/foo/f[^/]*", ePatternRegex);
+
+	MY_REGEX_EXT_TEST(glob_default, "/foo/**.ext", "/foo/[^\\x00]*\\.ext", ePatternRegex);
+	MY_REGEX_EXT_TEST(glob_null, "/foo/**.ext", "/foo/.*\\.ext", ePatternRegex);
+	MY_REGEX_EXT_TEST(glob_default, "/foo/f**.ext", "/foo/f[^\\x00]*\\.ext", ePatternRegex);
+	MY_REGEX_EXT_TEST(glob_null, "/foo/f**.ext", "/foo/f.*\\.ext", ePatternRegex);
+
+	MY_REGEX_EXT_TEST(glob_default, "/foo/*.ext", "/foo/[^/\\x00]*\\.ext", ePatternRegex);
+	MY_REGEX_EXT_TEST(glob_null, "/foo/*.ext", "/foo/[^/]*\\.ext", ePatternRegex);
+	MY_REGEX_EXT_TEST(glob_default, "/foo/f*.ext", "/foo/f[^/\\x00]*\\.ext", ePatternRegex);
+	MY_REGEX_EXT_TEST(glob_null, "/foo/f*.ext", "/foo/f[^/]*\\.ext", ePatternRegex);
+
 	return rc;
 }
 

=== modified file 'parser/ptrace.cc'
--- parser/ptrace.cc	2014-10-08 20:20:20 +0000
+++ parser/ptrace.cc	2015-01-30 17:48:18 +0000
@@ -139,7 +139,7 @@
 	buffer << "\\x" << std::setfill('0') << std::setw(2) << std::hex << AA_CLASS_PTRACE;
 
 	if (peer_label) {
-		ptype = convert_aaregex_to_pcre(peer_label, 0, buf, &pos);
+		ptype = convert_aaregex_to_pcre(peer_label, 0, glob_default, buf, &pos);
 		if (ptype == ePatternInvalid)
 			goto fail;
 		buffer << buf;

=== modified file 'parser/signal.cc'
--- parser/signal.cc	2014-10-08 20:20:20 +0000
+++ parser/signal.cc	2015-01-30 17:48:43 +0000
@@ -294,7 +294,7 @@
 		buffer << ")";
 	}
 	if (peer_label) {
-		ptype = convert_aaregex_to_pcre(peer_label, 0, buf, &pos);
+		ptype = convert_aaregex_to_pcre(peer_label, 0, glob_default, buf, &pos);
 		if (ptype == ePatternInvalid)
 			goto fail;
 		buffer << buf;





More information about the AppArmor mailing list