Blame SOURCES/0054-extensions-SECMARK-Implement-revision-1.patch

ec5e2e
From 3bd3af273ccfa550ed50ad19d4bcd04a29b88f5b Mon Sep 17 00:00:00 2001
ec5e2e
From: Phil Sutter <phil@nwl.cc>
ec5e2e
Date: Thu, 29 Apr 2021 15:28:59 +0200
ec5e2e
Subject: [PATCH] extensions: SECMARK: Implement revision 1
ec5e2e
ec5e2e
The changed data structure for communication with kernel allows to
ec5e2e
exclude the field 'secid' which is populated on kernel side. Thus
ec5e2e
this fixes the formerly always failing extension comparison breaking
ec5e2e
rule check and rule delete by content.
ec5e2e
ec5e2e
Signed-off-by: Phil Sutter <phil@nwl.cc>
ec5e2e
(cherry picked from commit 616800af0da86d151cb695f1376d5ec6ede6fa72)
ec5e2e
---
ec5e2e
 extensions/libxt_SECMARK.c           | 90 +++++++++++++++++++++-------
ec5e2e
 extensions/libxt_SECMARK.t           |  4 ++
ec5e2e
 include/linux/netfilter/xt_SECMARK.h |  6 ++
ec5e2e
 3 files changed, 80 insertions(+), 20 deletions(-)
ec5e2e
 create mode 100644 extensions/libxt_SECMARK.t
ec5e2e
ec5e2e
diff --git a/extensions/libxt_SECMARK.c b/extensions/libxt_SECMARK.c
ec5e2e
index 6ba8606355daa..24249bd618ffe 100644
ec5e2e
--- a/extensions/libxt_SECMARK.c
ec5e2e
+++ b/extensions/libxt_SECMARK.c
ec5e2e
@@ -29,6 +29,13 @@ static const struct xt_option_entry SECMARK_opts[] = {
ec5e2e
 	XTOPT_TABLEEND,
ec5e2e
 };
ec5e2e
 
ec5e2e
+static const struct xt_option_entry SECMARK_opts_v1[] = {
ec5e2e
+	{.name = "selctx", .id = O_SELCTX, .type = XTTYPE_STRING,
ec5e2e
+	 .flags = XTOPT_MAND | XTOPT_PUT,
ec5e2e
+	 XTOPT_POINTER(struct xt_secmark_target_info_v1, secctx)},
ec5e2e
+	XTOPT_TABLEEND,
ec5e2e
+};
ec5e2e
+
ec5e2e
 static void SECMARK_parse(struct xt_option_call *cb)
ec5e2e
 {
ec5e2e
 	struct xt_secmark_target_info *info = cb->data;
ec5e2e
@@ -37,15 +44,23 @@ static void SECMARK_parse(struct xt_option_call *cb)
ec5e2e
 	info->mode = SECMARK_MODE_SEL;
ec5e2e
 }
ec5e2e
 
ec5e2e
-static void print_secmark(const struct xt_secmark_target_info *info)
ec5e2e
+static void SECMARK_parse_v1(struct xt_option_call *cb)
ec5e2e
+{
ec5e2e
+	struct xt_secmark_target_info_v1 *info = cb->data;
ec5e2e
+
ec5e2e
+	xtables_option_parse(cb);
ec5e2e
+	info->mode = SECMARK_MODE_SEL;
ec5e2e
+}
ec5e2e
+
ec5e2e
+static void print_secmark(__u8 mode, const char *secctx)
ec5e2e
 {
ec5e2e
-	switch (info->mode) {
ec5e2e
+	switch (mode) {
ec5e2e
 	case SECMARK_MODE_SEL:
ec5e2e
-		printf("selctx %s", info->secctx);
ec5e2e
+		printf("selctx %s", secctx);
ec5e2e
 		break;
ec5e2e
-	
ec5e2e
+
ec5e2e
 	default:
ec5e2e
-		xtables_error(OTHER_PROBLEM, PFX "invalid mode %hhu\n", info->mode);
ec5e2e
+		xtables_error(OTHER_PROBLEM, PFX "invalid mode %hhu\n", mode);
ec5e2e
 	}
ec5e2e
 }
ec5e2e
 
ec5e2e
@@ -56,7 +71,17 @@ static void SECMARK_print(const void *ip, const struct xt_entry_target *target,
ec5e2e
 		(struct xt_secmark_target_info*)(target)->data;
ec5e2e
 
ec5e2e
 	printf(" SECMARK ");
ec5e2e
-	print_secmark(info);
ec5e2e
+	print_secmark(info->mode, info->secctx);
ec5e2e
+}
ec5e2e
+
ec5e2e
+static void SECMARK_print_v1(const void *ip,
ec5e2e
+			     const struct xt_entry_target *target, int numeric)
ec5e2e
+{
ec5e2e
+	const struct xt_secmark_target_info_v1 *info =
ec5e2e
+		(struct xt_secmark_target_info_v1 *)(target)->data;
ec5e2e
+
ec5e2e
+	printf(" SECMARK ");
ec5e2e
+	print_secmark(info->mode, info->secctx);
ec5e2e
 }
ec5e2e
 
ec5e2e
 static void SECMARK_save(const void *ip, const struct xt_entry_target *target)
ec5e2e
@@ -65,24 +90,49 @@ static void SECMARK_save(const void *ip, const struct xt_entry_target *target)
ec5e2e
 		(struct xt_secmark_target_info*)target->data;
ec5e2e
 
ec5e2e
 	printf(" --");
ec5e2e
-	print_secmark(info);
ec5e2e
+	print_secmark(info->mode, info->secctx);
ec5e2e
 }
ec5e2e
 
ec5e2e
-static struct xtables_target secmark_target = {
ec5e2e
-	.family		= NFPROTO_UNSPEC,
ec5e2e
-	.name		= "SECMARK",
ec5e2e
-	.version	= XTABLES_VERSION,
ec5e2e
-	.revision	= 0,
ec5e2e
-	.size		= XT_ALIGN(sizeof(struct xt_secmark_target_info)),
ec5e2e
-	.userspacesize	= XT_ALIGN(sizeof(struct xt_secmark_target_info)),
ec5e2e
-	.help		= SECMARK_help,
ec5e2e
-	.print		= SECMARK_print,
ec5e2e
-	.save		= SECMARK_save,
ec5e2e
-	.x6_parse	= SECMARK_parse,
ec5e2e
-	.x6_options	= SECMARK_opts,
ec5e2e
+static void SECMARK_save_v1(const void *ip,
ec5e2e
+			    const struct xt_entry_target *target)
ec5e2e
+{
ec5e2e
+	const struct xt_secmark_target_info_v1 *info =
ec5e2e
+		(struct xt_secmark_target_info_v1 *)target->data;
ec5e2e
+
ec5e2e
+	printf(" --");
ec5e2e
+	print_secmark(info->mode, info->secctx);
ec5e2e
+}
ec5e2e
+
ec5e2e
+static struct xtables_target secmark_tg_reg[] = {
ec5e2e
+	{
ec5e2e
+		.family		= NFPROTO_UNSPEC,
ec5e2e
+		.name		= "SECMARK",
ec5e2e
+		.version	= XTABLES_VERSION,
ec5e2e
+		.revision	= 0,
ec5e2e
+		.size		= XT_ALIGN(sizeof(struct xt_secmark_target_info)),
ec5e2e
+		.userspacesize	= XT_ALIGN(sizeof(struct xt_secmark_target_info)),
ec5e2e
+		.help		= SECMARK_help,
ec5e2e
+		.print		= SECMARK_print,
ec5e2e
+		.save		= SECMARK_save,
ec5e2e
+		.x6_parse	= SECMARK_parse,
ec5e2e
+		.x6_options	= SECMARK_opts,
ec5e2e
+	},
ec5e2e
+	{
ec5e2e
+		.family		= NFPROTO_UNSPEC,
ec5e2e
+		.name		= "SECMARK",
ec5e2e
+		.version	= XTABLES_VERSION,
ec5e2e
+		.revision	= 1,
ec5e2e
+		.size		= XT_ALIGN(sizeof(struct xt_secmark_target_info_v1)),
ec5e2e
+		.userspacesize	= XT_ALIGN(offsetof(struct xt_secmark_target_info_v1, secid)),
ec5e2e
+		.help		= SECMARK_help,
ec5e2e
+		.print		= SECMARK_print_v1,
ec5e2e
+		.save		= SECMARK_save_v1,
ec5e2e
+		.x6_parse	= SECMARK_parse_v1,
ec5e2e
+		.x6_options	= SECMARK_opts_v1,
ec5e2e
+	}
ec5e2e
 };
ec5e2e
 
ec5e2e
 void _init(void)
ec5e2e
 {
ec5e2e
-	xtables_register_target(&secmark_target);
ec5e2e
+	xtables_register_targets(secmark_tg_reg, ARRAY_SIZE(secmark_tg_reg));
ec5e2e
 }
ec5e2e
diff --git a/extensions/libxt_SECMARK.t b/extensions/libxt_SECMARK.t
ec5e2e
new file mode 100644
ec5e2e
index 0000000000000..39d4c09348bf4
ec5e2e
--- /dev/null
ec5e2e
+++ b/extensions/libxt_SECMARK.t
ec5e2e
@@ -0,0 +1,4 @@
ec5e2e
+:INPUT,FORWARD,OUTPUT
ec5e2e
+*security
ec5e2e
+-j SECMARK --selctx system_u:object_r:firewalld_exec_t:s0;=;OK
ec5e2e
+-j SECMARK;;FAIL
ec5e2e
diff --git a/include/linux/netfilter/xt_SECMARK.h b/include/linux/netfilter/xt_SECMARK.h
ec5e2e
index 989092bd6274b..31760a286a854 100644
ec5e2e
--- a/include/linux/netfilter/xt_SECMARK.h
ec5e2e
+++ b/include/linux/netfilter/xt_SECMARK.h
ec5e2e
@@ -19,4 +19,10 @@ struct xt_secmark_target_info {
ec5e2e
 	char secctx[SECMARK_SECCTX_MAX];
ec5e2e
 };
ec5e2e
 
ec5e2e
+struct xt_secmark_target_info_v1 {
ec5e2e
+	__u8 mode;
ec5e2e
+	char secctx[SECMARK_SECCTX_MAX];
ec5e2e
+	__u32 secid;
ec5e2e
+};
ec5e2e
+
ec5e2e
 #endif /*_XT_SECMARK_H_target */
ec5e2e
-- 
ec5e2e
2.31.1
ec5e2e