From: JingPiao Chen Date: Sat, 15 Jul 2017 01:11:33 +0000 (+0800) Subject: tests: check decoding of NETLINK_SELINUX protocol X-Git-Tag: v4.19~259 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8ff8c5422dece66e1e7b4a4b6be16249f9cc8729;p=strace tests: check decoding of NETLINK_SELINUX protocol * 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. --- diff --git a/tests/netlink_selinux.c b/tests/netlink_selinux.c index 6494fda9..2d768222 100644 --- a/tests/netlink_selinux.c +++ b/tests/netlink_selinux.c @@ -30,7 +30,7 @@ #include #include #include -#include "netlink.h" +#include "test_netlink.h" #include static void @@ -50,6 +50,46 @@ 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 const struct selnl_msg_setenforce msg = { + .val = 0xfbdcdfab + }; + TEST_NETLINK_OBJECT(fd, nlh0, + SELNL_MSG_SETENFORCE, NLM_F_REQUEST, msg, + PRINT_FIELD_D("{", msg, val); + printf("}")); +} + +static void +test_selnl_msg_policyload(const int fd) +{ + void *const nlh0 = tail_alloc(NLMSG_HDRLEN); + + static const struct selnl_msg_policyload msg = { + .seqno = 0xabdcfabc + }; + TEST_NETLINK_OBJECT(fd, nlh0, + SELNL_MSG_POLICYLOAD, NLM_F_REQUEST, msg, + PRINT_FIELD_U("{", msg, seqno); + printf("}")); +} + int main(void) { skip_if_unavailable("/proc/self/fd/"); @@ -57,6 +97,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 70491288..0648d792 100644 --- a/tests/test_netlink.h +++ b/tests/test_netlink.h @@ -45,3 +45,36 @@ (type_), #type_, \ (flags_), #flags_, \ (data_len_), (src_), (slen_), __VA_ARGS__) + +#define TEST_NETLINK_OBJECT(fd_, nlh0_, \ + type_, flags_, \ + obj_, ...) \ + do { \ + char pattern[DEFAULT_STRLEN]; \ + fill_memory_ex(pattern, sizeof(pattern), \ + 'a', 'z' - 'a' + 1); \ + 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, plen, \ + 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)