2
0
mirror of https://gitlab.com/apparmor/apparmor synced 2025-08-22 10:07:12 +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:
John Johansen 2024-07-18 06:29:44 -07:00
parent 42523bae91
commit 792f23c878
3 changed files with 7 additions and 6 deletions

View File

@ -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;

View File

@ -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());

View File

@ -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,