apparmor: dfa move character match into a macro

Signed-off-by: John Johansen <john.johansen@canonical.com>
This commit is contained in:
John Johansen 2017-08-08 11:58:33 -07:00
parent 9fcf78cca1
commit 074c1cd798
1 changed files with 27 additions and 47 deletions

View File

@ -329,6 +329,18 @@ fail:
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;
} }