]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
apparmor: increase left match history buffer size
authorJohn Johansen <john.johansen@canonical.com>
Fri, 31 May 2019 13:54:54 +0000 (06:54 -0700)
committerSeth Forshee <seth.forshee@canonical.com>
Thu, 9 Apr 2020 20:58:26 +0000 (15:58 -0500)
There have been cases reported where a history buffer size of 8 was
not enough to resolve conflict overlaps. Increase the buffer to and
get rid of the size element which is currently just storing the
constant WB_HISTORY_SIZE.

Signed-off-by: John Johansen <john.johansen@canonical.com>
(cherry picked from commit 136db994852a9b405ac1074de0e7a1c4c840b8ee)
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
security/apparmor/include/match.h
security/apparmor/match.c

index 6b0af638a18dc29d8c54a6239b551be57cf81eb6..e23f4aadc1ff214b15a46b40eebd705a8101e46a 100644 (file)
@@ -134,7 +134,7 @@ unsigned int aa_dfa_matchn_until(struct aa_dfa *dfa, unsigned int start,
 
 void aa_dfa_free_kref(struct kref *kref);
 
-#define WB_HISTORY_SIZE 8
+#define WB_HISTORY_SIZE 24
 struct match_workbuf {
        unsigned int count;
        unsigned int pos;
@@ -147,7 +147,6 @@ struct match_workbuf N = {          \
        .count = 0,                     \
        .pos = 0,                       \
        .len = 0,                       \
-       .size = WB_HISTORY_SIZE,                        \
 }
 
 unsigned int aa_dfa_leftmatch(struct aa_dfa *dfa, unsigned int start,
index 6ccd3734a841f477eac8cad576ea0ff600ddb7d8..525ce22dc0e99f24cadc6879f90e2bb7e8030435 100644 (file)
@@ -616,8 +616,8 @@ unsigned int aa_dfa_matchn_until(struct aa_dfa *dfa, unsigned int start,
 
 #define inc_wb_pos(wb)                                         \
 do {                                                           \
-       wb->pos = (wb->pos + 1) & (wb->size - 1);               \
-       wb->len = (wb->len + 1) & (wb->size - 1);               \
+       wb->pos = (wb->pos + 1) & (WB_HISTORY_SIZE - 1);                \
+       wb->len = (wb->len + 1) & (WB_HISTORY_SIZE - 1);                \
 } while (0)
 
 /* For DFAs that don't support extended tagging of states */
@@ -636,7 +636,7 @@ static bool is_loop(struct match_workbuf *wb, unsigned int state,
                        return true;
                }
                if (pos == 0)
-                       pos = wb->size;
+                       pos = WB_HISTORY_SIZE;
                pos--;
        }