mirror of
https://gitlab.com/apparmor/apparmor.git
synced 2025-03-04 08:24:42 +01:00

Currently the NULL character is used as an out of band transition for string/path elements. This works for them as the NULL character is not valid for this data. However this does not work for binary data that can contain a NULL character. So far we have only dealt with fixed length fields of binary data making the NULL separator either unnecessary. However binary data like in the xattr match and mount data field are variable length and can contain NULL characters. To deal with this add the ability to specify out of band transitions, that can only be triggered by code not input data. The out of band transition can be used to separate variable length data fields just as the NULL transition has been used to separate variable length strings. In the compressed hfa out of band transitions are expressed as a negative offset from the states base. This leaves us room to expand the character match range in the future if desired and on average makes the range between the out of band transition and the input transitions smaller than would be had if the out of band transition had been stored after the valid input transitions. Out of band transitions in the dfa will not break old kernels that don't know about them, but they won't be able to trigger the out of band transition match. So they should not be used unless the kernel indicates that it supports them. It should be noted that this patch only adds support for a single out of band transition. If multiple out of band transitions are required. It is trivial to extend. - Add a tag indicating support in the kernel - add a oob max range field to the dfa header so the kernel knows what the max range that needs verifying is. - extend oob generation fns to generate oob based on value instead of a fixed -1. Signed-off-by: John Johansen <john.johansen@canonical.com>
43 lines
822 B
C
43 lines
822 B
C
#ifndef __FLEX_TABLES_H
|
|
#define __FLEX_TABLES_H
|
|
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
|
|
#define YYTH_MAGIC 0xF13C57B1
|
|
#define YYTH_FLAG_DIFF_ENCODE 1
|
|
#define YYTH_FLAG_OOB_TRANS 2
|
|
|
|
struct table_set_header {
|
|
uint32_t th_magic; /* TH_MAGIC */
|
|
uint32_t th_hsize;
|
|
uint32_t th_ssize;
|
|
uint16_t th_flags;
|
|
/* char th_version[];
|
|
char th_name[];
|
|
char th_pad64[];*/
|
|
} __attribute__ ((packed));
|
|
|
|
#define YYTD_ID_ACCEPT 1
|
|
#define YYTD_ID_BASE 2
|
|
#define YYTD_ID_CHK 3
|
|
#define YYTD_ID_DEF 4
|
|
#define YYTD_ID_EC 5
|
|
#define YYTD_ID_META 6
|
|
#define YYTD_ID_ACCEPT2 7
|
|
#define YYTD_ID_NXT 8
|
|
|
|
#define YYTD_DATA8 1
|
|
#define YYTD_DATA16 2
|
|
#define YYTD_DATA32 4
|
|
|
|
struct table_header {
|
|
uint16_t td_id;
|
|
uint16_t td_flags;
|
|
uint32_t td_hilen;
|
|
uint32_t td_lolen;
|
|
/* char td_data[];
|
|
char td_pad64[];*/
|
|
} __attribute__ ((packed));
|
|
|
|
#endif
|