mirror of
https://gitlab.com/apparmor/apparmor
synced 2025-09-01 06:45:38 +00:00
This is a preparatory patch for the fix to launchpad.net/bugs/599450.
It combines the two separate table resize code segments into a single functionally equivalent segment. It does not fix the bug.
This commit is contained in:
@@ -2101,24 +2101,11 @@ bool TransitionTable::fits_in(vector <pair<size_t, size_t> > &free_list,
|
|||||||
/* if it overflows the next_check array it fits in as we will
|
/* if it overflows the next_check array it fits in as we will
|
||||||
* resize */
|
* resize */
|
||||||
if (c >= next_check.size())
|
if (c >= next_check.size())
|
||||||
goto resize;
|
return true;
|
||||||
if (next_check[c].second)
|
if (next_check[c].second)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
|
||||||
resize:
|
|
||||||
next_check.resize(base + cases.cases.rbegin()->first + 1);
|
|
||||||
size_t prev = pos;
|
|
||||||
size_t x = pos;
|
|
||||||
/* find last free list entry */
|
|
||||||
while (x) {
|
|
||||||
prev = x;
|
|
||||||
x = free_list[x].second;
|
|
||||||
}
|
|
||||||
x = free_list. size();
|
|
||||||
free_list.resize(base + cases.cases.rbegin()->first + 1);
|
|
||||||
init_free_list(free_list, prev, x);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2130,6 +2117,7 @@ void TransitionTable::insert_state(vector <pair<size_t, size_t> > &free_list,
|
|||||||
{
|
{
|
||||||
State *default_state = dfa.nonmatching;
|
State *default_state = dfa.nonmatching;
|
||||||
size_t base = 0;
|
size_t base = 0;
|
||||||
|
int resize;
|
||||||
|
|
||||||
Trans::iterator i = dfa.trans.find(from);
|
Trans::iterator i = dfa.trans.find(from);
|
||||||
if (i == dfa.trans.end()) {
|
if (i == dfa.trans.end()) {
|
||||||
@@ -2146,6 +2134,7 @@ void TransitionTable::insert_state(vector <pair<size_t, size_t> > &free_list,
|
|||||||
goto do_insert;
|
goto do_insert;
|
||||||
|
|
||||||
repeat:
|
repeat:
|
||||||
|
resize = 0;
|
||||||
/* get the first free entry that won't underflow */
|
/* get the first free entry that won't underflow */
|
||||||
while (x && (x < c)) {
|
while (x && (x < c)) {
|
||||||
prev = x;
|
prev = x;
|
||||||
@@ -2158,15 +2147,24 @@ repeat:
|
|||||||
x = free_list[x].second;
|
x = free_list[x].second;
|
||||||
}
|
}
|
||||||
if (!x) {
|
if (!x) {
|
||||||
/* expand next_check and free_list */
|
resize = cases.cases.rbegin()->first - cases.begin()->first + 1;
|
||||||
x = free_list.size();
|
x = free_list.size();
|
||||||
size_t range = cases.cases.rbegin()->first - cases.begin()->first + 1;
|
/* set prev to last free */
|
||||||
next_check.resize(next_check.size() + range);
|
} else if (x + cases.cases.rbegin()->first + 1 - cases.begin()->first > next_check.size()) {
|
||||||
free_list.resize(free_list.size() + range);
|
resize = cases.cases.rbegin()->first + 1;
|
||||||
init_free_list(free_list, prev, x);
|
for (size_t y = x; y; y = free_list[y].second)
|
||||||
|
prev = y;
|
||||||
|
}
|
||||||
|
if (resize) {
|
||||||
|
/* expand next_check and free_list */
|
||||||
|
size_t old_size = free_list.size();
|
||||||
|
next_check.resize(next_check.size() + resize);
|
||||||
|
free_list.resize(free_list.size() + resize);
|
||||||
|
init_free_list(free_list, prev, old_size);
|
||||||
if (!first_free)
|
if (!first_free)
|
||||||
first_free = x;
|
first_free = old_size;;
|
||||||
goto repeat;
|
if (x == old_size)
|
||||||
|
goto repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
base = x - c;
|
base = x - c;
|
||||||
|
Reference in New Issue
Block a user