mirror of
https://gitlab.com/apparmor/apparmor
synced 2025-09-01 06:45:38 +00:00
parser: add regex generator for range
Signed-off-by: Georgia Garcia <georgia.garcia@canonical.com>
This commit is contained in:
committed by
John Johansen
parent
2be9c431ca
commit
a71ac76e6d
@@ -845,6 +845,98 @@ int clear_and_convert_entry(std::string& buffer, char *entry)
|
||||
return convert_entry(buffer, entry);
|
||||
}
|
||||
|
||||
static std::vector<std::pair<bignum, bignum>> regex_range_generator(bignum start, bignum end)
|
||||
{
|
||||
std::vector<std::pair<bignum, bignum>> forward;
|
||||
std::vector<std::pair<bignum, bignum>> reverse;
|
||||
bignum next, prev;
|
||||
|
||||
while (start <= end) {
|
||||
next = bignum::upper_bound_regex(start);
|
||||
if (next > end)
|
||||
break;
|
||||
|
||||
forward.emplace_back(start, next);
|
||||
start = next + 1;
|
||||
}
|
||||
|
||||
while (!end.negative && end >= start) {
|
||||
prev = bignum::lower_bound_regex(end);
|
||||
if (prev < start || prev.negative)
|
||||
break;
|
||||
|
||||
reverse.emplace_back(prev, end);
|
||||
end = prev - 1;
|
||||
}
|
||||
|
||||
if (!end.negative && start <= end) {
|
||||
forward.emplace_back(start, end);
|
||||
}
|
||||
|
||||
forward.insert(forward.end(), reverse.rbegin(), reverse.rend());
|
||||
return forward;
|
||||
}
|
||||
|
||||
static std::string generate_regex_range(bignum start, bignum end)
|
||||
{
|
||||
std::ostringstream result;
|
||||
std::vector<std::pair<bignum, bignum>> regex_range;
|
||||
int j;
|
||||
regex_range = regex_range_generator(start, end);
|
||||
for (auto &i: regex_range) {
|
||||
bignum sstart = i.first;
|
||||
bignum send = i.second;
|
||||
|
||||
for (j = sstart.size() - 1; j >= 0; j--) {
|
||||
if (sstart[j] == send[j]) {
|
||||
result << std::hex << sstart[j];
|
||||
} else {
|
||||
if (sstart[j] < 10 && send[j] >= 10) {
|
||||
result << '[';
|
||||
result << std::hex << sstart[j];
|
||||
if (sstart[j] < 9) {
|
||||
result << '-';
|
||||
result << '9';
|
||||
}
|
||||
if (send[j] > 10) {
|
||||
result << 'a';
|
||||
result << '-';
|
||||
}
|
||||
result << std::hex << send[j];
|
||||
result << ']';
|
||||
} else {
|
||||
result << '[';
|
||||
result << std::hex << sstart[j];
|
||||
result << '-';
|
||||
result << std::hex << send[j];
|
||||
result << ']';
|
||||
}
|
||||
}
|
||||
}
|
||||
if (&i != ®ex_range.back())
|
||||
result << ",";
|
||||
}
|
||||
return result.str();
|
||||
}
|
||||
|
||||
int convert_range(std::string& buffer, bignum start, bignum end)
|
||||
{
|
||||
pattern_t ptype;
|
||||
int pos;
|
||||
|
||||
std::string regex_range = generate_regex_range(start, end);
|
||||
|
||||
if (!regex_range.empty()) {
|
||||
ptype = convert_aaregex_to_pcre(regex_range.c_str(), 0, glob_default, buffer, &pos);
|
||||
if (ptype == ePatternInvalid)
|
||||
return FALSE;
|
||||
} else {
|
||||
buffer.append(default_match_pattern);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int post_process_policydb_ents(Profile *prof)
|
||||
{
|
||||
for (RuleList::iterator i = prof->rule_ents.begin(); i != prof->rule_ents.end(); i++) {
|
||||
|
Reference in New Issue
Block a user