mirror of
https://gitlab.com/apparmor/apparmor
synced 2025-08-22 18:17:09 +00:00
chfa: get not-flextable size and padding correct
The kernel does not expect a name and it is not used even within the parser so drop it. Correct the padding calculation. sizeof(th_version) includes the trailing \0 in the count so we should not be adding it explicitly. Doing so made it seem like we were writing an extra byte and messing things up, because the string write below did not include the \0 which we had to add explicitly. Switch to writing the th_version using size_of() bytes as is used in the pad calculation, to avoid confusion around the header padding. Signed-off-by: John Johansen <john.johansen@canonical.com>
This commit is contained in:
parent
42523bae91
commit
792f23c878
@ -307,7 +307,7 @@ void *aare_rules::create_dfa(size_t *size, int *min_match_len, optflags const &o
|
|||||||
CHFA chfa(dfa, eq, opts);
|
CHFA chfa(dfa, eq, opts);
|
||||||
if (opts.dump & DUMP_DFA_TRANS_TABLE)
|
if (opts.dump & DUMP_DFA_TRANS_TABLE)
|
||||||
chfa.dump(cerr);
|
chfa.dump(cerr);
|
||||||
chfa.flex_table(stream, "");
|
chfa.flex_table(stream);
|
||||||
}
|
}
|
||||||
catch(int error) {
|
catch(int error) {
|
||||||
*size = 0;
|
*size = 0;
|
||||||
|
@ -368,7 +368,7 @@ template<class Iter>
|
|||||||
os << fill64(sizeof(td) + sizeof(*pos) * size);
|
os << fill64(sizeof(td) + sizeof(*pos) * size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHFA::flex_table(ostream &os, const char *name)
|
void CHFA::flex_table(ostream &os)
|
||||||
{
|
{
|
||||||
const char th_version[] = "notflex";
|
const char th_version[] = "notflex";
|
||||||
struct table_set_header th = { 0, 0, 0, 0 };
|
struct table_set_header th = { 0, 0, 0, 0 };
|
||||||
@ -419,7 +419,8 @@ void CHFA::flex_table(ostream &os, const char *name)
|
|||||||
|
|
||||||
/* Write the actual flex parser table. */
|
/* Write the actual flex parser table. */
|
||||||
/* TODO: add max_oob */
|
/* TODO: add max_oob */
|
||||||
size_t hsize = pad64(sizeof(th) + sizeof(th_version) + strlen(name) + 1);
|
// sizeof(th_version) includes trailing \0
|
||||||
|
size_t hsize = pad64(sizeof(th) + sizeof(th_version));
|
||||||
th.th_magic = htonl(YYTH_REGEX_MAGIC);
|
th.th_magic = htonl(YYTH_REGEX_MAGIC);
|
||||||
th.th_flags = htons(chfaflags);
|
th.th_flags = htons(chfaflags);
|
||||||
th.th_hsize = htonl(hsize);
|
th.th_hsize = htonl(hsize);
|
||||||
@ -432,8 +433,8 @@ void CHFA::flex_table(ostream &os, const char *name)
|
|||||||
flex_table_size(next_vec.begin(), next_vec.end()) +
|
flex_table_size(next_vec.begin(), next_vec.end()) +
|
||||||
flex_table_size(check_vec.begin(), check_vec.end()));
|
flex_table_size(check_vec.begin(), check_vec.end()));
|
||||||
os.write((char *)&th, sizeof(th));
|
os.write((char *)&th, sizeof(th));
|
||||||
os << th_version << (char)0 << name << (char)0;
|
os.write(th_version, sizeof(th_version));
|
||||||
os << fill64(sizeof(th) + sizeof(th_version) + strlen(name) + 1);
|
os << fill64(sizeof(th) + sizeof(th_version));
|
||||||
|
|
||||||
write_flex_table(os, YYTD_ID_ACCEPT, accept.begin(), accept.end());
|
write_flex_table(os, YYTD_ID_ACCEPT, accept.begin(), accept.end());
|
||||||
write_flex_table(os, YYTD_ID_ACCEPT2, accept2.begin(), accept2.end());
|
write_flex_table(os, YYTD_ID_ACCEPT2, accept2.begin(), accept2.end());
|
||||||
|
@ -39,7 +39,7 @@ class CHFA {
|
|||||||
public:
|
public:
|
||||||
CHFA(DFA &dfa, map<transchar, transchar> &eq, optflags const &opts);
|
CHFA(DFA &dfa, map<transchar, transchar> &eq, optflags const &opts);
|
||||||
void dump(ostream & os);
|
void dump(ostream & os);
|
||||||
void flex_table(ostream &os, const char *name);
|
void flex_table(ostream &os);
|
||||||
void init_free_list(vector<pair<size_t, size_t> > &free_list,
|
void init_free_list(vector<pair<size_t, size_t> > &free_list,
|
||||||
size_t prev, size_t start);
|
size_t prev, size_t start);
|
||||||
bool fits_in(vector<pair<size_t, size_t> > &free_list, size_t base,
|
bool fits_in(vector<pair<size_t, size_t> > &free_list, size_t base,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user