aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--security/apparmor/match.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/security/apparmor/match.c b/security/apparmor/match.c
index 1ff823031c73..727eb4200d5c 100644
--- a/security/apparmor/match.c
+++ b/security/apparmor/match.c
@@ -23,6 +23,8 @@
23#include "include/apparmor.h" 23#include "include/apparmor.h"
24#include "include/match.h" 24#include "include/match.h"
25 25
26#define base_idx(X) ((X) & 0xffffff)
27
26/** 28/**
27 * unpack_table - unpack a dfa table (one of accept, default, base, next check) 29 * unpack_table - unpack a dfa table (one of accept, default, base, next check)
28 * @blob: data to unpack (NOT NULL) 30 * @blob: data to unpack (NOT NULL)
@@ -137,7 +139,7 @@ static int verify_dfa(struct aa_dfa *dfa, int flags)
137 for (i = 0; i < state_count; i++) { 139 for (i = 0; i < state_count; i++) {
138 if (DEFAULT_TABLE(dfa)[i] >= state_count) 140 if (DEFAULT_TABLE(dfa)[i] >= state_count)
139 goto out; 141 goto out;
140 if (BASE_TABLE(dfa)[i] + 255 >= trans_count) { 142 if (base_idx(BASE_TABLE(dfa)[i]) + 255 >= trans_count) {
141 printk(KERN_ERR "AppArmor DFA next/check upper " 143 printk(KERN_ERR "AppArmor DFA next/check upper "
142 "bounds error\n"); 144 "bounds error\n");
143 goto out; 145 goto out;
@@ -313,7 +315,7 @@ unsigned int aa_dfa_match_len(struct aa_dfa *dfa, unsigned int start,
313 u8 *equiv = EQUIV_TABLE(dfa); 315 u8 *equiv = EQUIV_TABLE(dfa);
314 /* default is direct to next state */ 316 /* default is direct to next state */
315 for (; len; len--) { 317 for (; len; len--) {
316 pos = base[state] + equiv[(u8) *str++]; 318 pos = base_idx(base[state]) + equiv[(u8) *str++];
317 if (check[pos] == state) 319 if (check[pos] == state)
318 state = next[pos]; 320 state = next[pos];
319 else 321 else
@@ -322,7 +324,7 @@ unsigned int aa_dfa_match_len(struct aa_dfa *dfa, unsigned int start,
322 } else { 324 } else {
323 /* default is direct to next state */ 325 /* default is direct to next state */
324 for (; len; len--) { 326 for (; len; len--) {
325 pos = base[state] + (u8) *str++; 327 pos = base_idx(base[state]) + (u8) *str++;
326 if (check[pos] == state) 328 if (check[pos] == state)
327 state = next[pos]; 329 state = next[pos];
328 else 330 else
@@ -363,7 +365,7 @@ unsigned int aa_dfa_match(struct aa_dfa *dfa, unsigned int start,
363 u8 *equiv = EQUIV_TABLE(dfa); 365 u8 *equiv = EQUIV_TABLE(dfa);
364 /* default is direct to next state */ 366 /* default is direct to next state */
365 while (*str) { 367 while (*str) {
366 pos = base[state] + equiv[(u8) *str++]; 368 pos = base_idx(base[state]) + equiv[(u8) *str++];
367 if (check[pos] == state) 369 if (check[pos] == state)
368 state = next[pos]; 370 state = next[pos];
369 else 371 else
@@ -372,7 +374,7 @@ unsigned int aa_dfa_match(struct aa_dfa *dfa, unsigned int start,
372 } else { 374 } else {
373 /* default is direct to next state */ 375 /* default is direct to next state */
374 while (*str) { 376 while (*str) {
375 pos = base[state] + (u8) *str++; 377 pos = base_idx(base[state]) + (u8) *str++;
376 if (check[pos] == state) 378 if (check[pos] == state)
377 state = next[pos]; 379 state = next[pos];
378 else 380 else
@@ -408,14 +410,14 @@ unsigned int aa_dfa_next(struct aa_dfa *dfa, unsigned int state,
408 u8 *equiv = EQUIV_TABLE(dfa); 410 u8 *equiv = EQUIV_TABLE(dfa);
409 /* default is direct to next state */ 411 /* default is direct to next state */
410 412
411 pos = base[state] + equiv[(u8) c]; 413 pos = base_idx(base[state]) + equiv[(u8) c];
412 if (check[pos] == state) 414 if (check[pos] == state)
413 state = next[pos]; 415 state = next[pos];
414 else 416 else
415 state = def[state]; 417 state = def[state];
416 } else { 418 } else {
417 /* default is direct to next state */ 419 /* default is direct to next state */
418 pos = base[state] + (u8) c; 420 pos = base_idx(base[state]) + (u8) c;
419 if (check[pos] == state) 421 if (check[pos] == state)
420 state = next[pos]; 422 state = next[pos];
421 else 423 else