[PATCH 2/2] tests: check decoding of NETLINK_SELINUX protocol

JingPiao Chen chenjingpiao at gmail.com
Fri Jul 14 05:16:37 UTC 2017


* test_netlink.h (TEST_NETLINK_OBJECT): New macro.
* tests/netlink_selinux.c: Include "test_netlink.h"
instead of "netlink.h".
(test_selnl_msg_unspec, test_selnl_msg_setenforce,
test_selnl_msg_policyload): New functions.
(main): Use them.
---
 tests/netlink_selinux.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++-
 tests/test_netlink.h    | 30 +++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/tests/netlink_selinux.c b/tests/netlink_selinux.c
index 6494fda..ecb50ca 100644
--- a/tests/netlink_selinux.c
+++ b/tests/netlink_selinux.c
@@ -30,7 +30,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/socket.h>
-#include "netlink.h"
+#include "test_netlink.h"
 #include <linux/selinux_netlink.h>
 
 static void
@@ -50,6 +50,52 @@ test_nlmsg_type(const int fd)
 	       fd, nlh.nlmsg_len, (unsigned) sizeof(nlh), sprintrc(rc));
 }
 
+static void
+test_selnl_msg_unspec(const int fd)
+{
+	void *const nlh0 = tail_alloc(NLMSG_HDRLEN);
+
+	TEST_NETLINK_(fd, nlh0,
+		      0xffff, "0xffff /* SELNL_MSG_??? */",
+		      NLM_F_REQUEST, "NLM_F_REQUEST",
+		      4, "1234", 4,
+		      printf("\"\\x31\\x32\\x33\\x34\""));
+}
+
+static void
+test_selnl_msg_setenforce(const int fd)
+{
+	void *const nlh0 = tail_alloc(NLMSG_HDRLEN);
+	static char pattern[4096];
+	fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1);
+
+	static const struct selnl_msg_setenforce msg = {
+		.val = 0xfbdcdfab
+	};
+	TEST_NETLINK_OBJECT(fd, nlh0,
+			    SELNL_MSG_SETENFORCE, NLM_F_REQUEST,
+			    pattern, msg,
+			    PRINT_FIELD_D("{", msg, val);
+			    printf("}"));
+}
+
+static void
+test_selnl_msg_policyload(const int fd)
+{
+	void *const nlh0 = tail_alloc(NLMSG_HDRLEN);
+	static char pattern[4096];
+	fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1);
+
+	static const struct selnl_msg_policyload msg = {
+		.seqno = 0xabdcfabc
+	};
+	TEST_NETLINK_OBJECT(fd, nlh0,
+			    SELNL_MSG_POLICYLOAD, NLM_F_REQUEST,
+			    pattern, msg,
+			    PRINT_FIELD_U("{", msg, seqno);
+			    printf("}"));
+}
+
 int main(void)
 {
 	skip_if_unavailable("/proc/self/fd/");
@@ -57,6 +103,9 @@ int main(void)
 	int fd = create_nl_socket(NETLINK_SELINUX);
 
 	test_nlmsg_type(fd);
+	test_selnl_msg_unspec(fd);
+	test_selnl_msg_setenforce(fd);
+	test_selnl_msg_policyload(fd);
 
 	printf("+++ exited with 0 +++\n");
 
diff --git a/tests/test_netlink.h b/tests/test_netlink.h
index 7049128..b6f6ac9 100644
--- a/tests/test_netlink.h
+++ b/tests/test_netlink.h
@@ -45,3 +45,33 @@
 		      (type_), #type_,					\
 		      (flags_), #flags_,				\
 		      (data_len_), (src_), (slen_), __VA_ARGS__)
+
+#define TEST_NETLINK_OBJECT(fd_, nlh0_,					\
+			    type_, flags_,				\
+			    pattern_, obj_, ...)			\
+	do {								\
+		const unsigned int plen =				\
+			sizeof(obj_) - 1 > DEFAULT_STRLEN		\
+			? DEFAULT_STRLEN : (int) sizeof(obj_) - 1;	\
+		/* len < sizeof(obj_) */				\
+		TEST_NETLINK_((fd_), (nlh0_),				\
+			      (type_), #type_,				\
+			      (flags_), #flags_,			\
+			      plen, (pattern_), plen,			\
+			      print_quoted_hex((pattern_), plen));	\
+		/* short read of sizeof(obj_) */			\
+		TEST_NETLINK_((fd_), (nlh0_),				\
+			      (type_), #type_,				\
+			      (flags_), #flags_,			\
+			      sizeof(obj_),				\
+			      (pattern_), sizeof(obj_) - 1,		\
+			      printf("%p",				\
+				     NLMSG_DATA(TEST_NETLINK_nlh)));	\
+		/* sizeof(obj_) */					\
+		TEST_NETLINK_((fd_), (nlh0_),				\
+			      (type_), #type_,				\
+			      (flags_), #flags_,			\
+			      sizeof(obj_),				\
+			      &(obj_), sizeof(obj_),			\
+			      __VA_ARGS__);				\
+	} while (0)
-- 
2.7.4





More information about the Strace-devel mailing list