|
@@ -29,7 +29,14 @@
|
|
|
#include "include/policy.h"
|
|
|
#include "include/policy_unpack.h"
|
|
|
|
|
|
+#define K_ABI_MASK 0x3ff
|
|
|
#define FORCE_COMPLAIN_FLAG 0x800
|
|
|
+#define VERSION_LT(X, Y) (((X) & K_ABI_MASK) < ((Y) & K_ABI_MASK))
|
|
|
+#define VERSION_GT(X, Y) (((X) & K_ABI_MASK) > ((Y) & K_ABI_MASK))
|
|
|
+
|
|
|
+#define v5 5 /* base version */
|
|
|
+#define v6 6 /* per entry policydb mediation check */
|
|
|
+#define v7 7 /* full network masking */
|
|
|
|
|
|
/*
|
|
|
* The AppArmor interface treats data as a type byte followed by the
|
|
@@ -646,19 +653,21 @@ static int verify_header(struct aa_ext *e, int required, const char **ns)
|
|
|
/* get the interface version */
|
|
|
if (!unpack_u32(e, &e->version, "version")) {
|
|
|
if (required) {
|
|
|
- audit_iface(NULL, NULL, "invalid profile format", e,
|
|
|
- error);
|
|
|
- return error;
|
|
|
- }
|
|
|
-
|
|
|
- /* check that the interface version is currently supported */
|
|
|
- if (e->version != 5) {
|
|
|
- audit_iface(NULL, NULL, "unsupported interface version",
|
|
|
+ audit_iface(NULL, NULL, "invalid profile format",
|
|
|
e, error);
|
|
|
return error;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /* Check that the interface version is currently supported.
|
|
|
+ * if not specified use previous version
|
|
|
+ * Mask off everything that is not kernel abi version
|
|
|
+ */
|
|
|
+ if (VERSION_LT(e->version, v5) && VERSION_GT(e->version, v7)) {
|
|
|
+ audit_iface(NULL, NULL, "unsupported interface version",
|
|
|
+ e, error);
|
|
|
+ return error;
|
|
|
+ }
|
|
|
|
|
|
/* read the namespace if present */
|
|
|
if (unpack_str(e, &name, "namespace")) {
|