Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 074c1cd7 authored by John Johansen's avatar John Johansen
Browse files

apparmor: dfa move character match into a macro

parent 9fcf78cc
Loading
Loading
Loading
Loading
+27 −47
Original line number Original line Diff line number Diff line
@@ -329,6 +329,18 @@ struct aa_dfa *aa_dfa_unpack(void *blob, size_t size, int flags)
	return ERR_PTR(error);
	return ERR_PTR(error);
}
}


#define match_char(state, def, base, next, check, C)	\
do {							\
	u32 b = (base)[(state)];			\
	unsigned int pos = base_idx(b) + (C);		\
	if ((check)[pos] != (state)) {			\
		(state) = (def)[(state)];		\
		break;					\
	}						\
	(state) = (next)[pos];				\
	break;						\
} while (1)

/**
/**
 * aa_dfa_match_len - traverse @dfa to find state @str stops at
 * aa_dfa_match_len - traverse @dfa to find state @str stops at
 * @dfa: the dfa to match @str against  (NOT NULL)
 * @dfa: the dfa to match @str against  (NOT NULL)
@@ -352,7 +364,7 @@ unsigned int aa_dfa_match_len(struct aa_dfa *dfa, unsigned int start,
	u32 *base = BASE_TABLE(dfa);
	u32 *base = BASE_TABLE(dfa);
	u16 *next = NEXT_TABLE(dfa);
	u16 *next = NEXT_TABLE(dfa);
	u16 *check = CHECK_TABLE(dfa);
	u16 *check = CHECK_TABLE(dfa);
	unsigned int state = start, pos;
	unsigned int state = start;


	if (state == 0)
	if (state == 0)
		return 0;
		return 0;
@@ -361,23 +373,13 @@ unsigned int aa_dfa_match_len(struct aa_dfa *dfa, unsigned int start,
	if (dfa->tables[YYTD_ID_EC]) {
	if (dfa->tables[YYTD_ID_EC]) {
		/* Equivalence class table defined */
		/* Equivalence class table defined */
		u8 *equiv = EQUIV_TABLE(dfa);
		u8 *equiv = EQUIV_TABLE(dfa);
		/* default is direct to next state */
		for (; len; len--)
		for (; len; len--) {
			match_char(state, def, base, next, check,
			pos = base_idx(base[state]) + equiv[(u8) *str++];
				   equiv[(u8) *str++]);
			if (check[pos] == state)
				state = next[pos];
			else
				state = def[state];
		}
	} else {
	} else {
		/* default is direct to next state */
		/* default is direct to next state */
		for (; len; len--) {
		for (; len; len--)
			pos = base_idx(base[state]) + (u8) *str++;
			match_char(state, def, base, next, check, (u8) *str++);
			if (check[pos] == state)
				state = next[pos];
			else
				state = def[state];
		}
	}
	}


	return state;
	return state;
@@ -402,7 +404,7 @@ unsigned int aa_dfa_match(struct aa_dfa *dfa, unsigned int start,
	u32 *base = BASE_TABLE(dfa);
	u32 *base = BASE_TABLE(dfa);
	u16 *next = NEXT_TABLE(dfa);
	u16 *next = NEXT_TABLE(dfa);
	u16 *check = CHECK_TABLE(dfa);
	u16 *check = CHECK_TABLE(dfa);
	unsigned int state = start, pos;
	unsigned int state = start;


	if (state == 0)
	if (state == 0)
		return 0;
		return 0;
@@ -412,22 +414,13 @@ unsigned int aa_dfa_match(struct aa_dfa *dfa, unsigned int start,
		/* Equivalence class table defined */
		/* Equivalence class table defined */
		u8 *equiv = EQUIV_TABLE(dfa);
		u8 *equiv = EQUIV_TABLE(dfa);
		/* default is direct to next state */
		/* default is direct to next state */
		while (*str) {
		while (*str)
			pos = base_idx(base[state]) + equiv[(u8) *str++];
			match_char(state, def, base, next, check,
			if (check[pos] == state)
				   equiv[(u8) *str++]);
				state = next[pos];
			else
				state = def[state];
		}
	} else {
	} else {
		/* default is direct to next state */
		/* default is direct to next state */
		while (*str) {
		while (*str)
			pos = base_idx(base[state]) + (u8) *str++;
			match_char(state, def, base, next, check, (u8) *str++);
			if (check[pos] == state)
				state = next[pos];
			else
				state = def[state];
		}
	}
	}


	return state;
	return state;
@@ -450,27 +443,14 @@ unsigned int aa_dfa_next(struct aa_dfa *dfa, unsigned int state,
	u32 *base = BASE_TABLE(dfa);
	u32 *base = BASE_TABLE(dfa);
	u16 *next = NEXT_TABLE(dfa);
	u16 *next = NEXT_TABLE(dfa);
	u16 *check = CHECK_TABLE(dfa);
	u16 *check = CHECK_TABLE(dfa);
	unsigned int pos;


	/* current state is <state>, matching character *str */
	/* current state is <state>, matching character *str */
	if (dfa->tables[YYTD_ID_EC]) {
	if (dfa->tables[YYTD_ID_EC]) {
		/* Equivalence class table defined */
		/* Equivalence class table defined */
		u8 *equiv = EQUIV_TABLE(dfa);
		u8 *equiv = EQUIV_TABLE(dfa);
		/* default is direct to next state */
		match_char(state, def, base, next, check, equiv[(u8) c]);

	} else
		pos = base_idx(base[state]) + equiv[(u8) c];
		match_char(state, def, base, next, check, (u8) c);
		if (check[pos] == state)
			state = next[pos];
		else
			state = def[state];
	} else {
		/* default is direct to next state */
		pos = base_idx(base[state]) + (u8) c;
		if (check[pos] == state)
			state = next[pos];
		else
			state = def[state];
	}


	return state;
	return state;
}
}