[PATCH] netlink: fix NLMSG_DONE never enter family specific decoder

JingPiao Chen chenjingpiao at gmail.com
Sat Jun 24 05:35:18 UTC 2017


* netlink.c (print_nlmsghdr): Remove condition
nlmsghdr->nlmsg_type < NLMSG_MIN_TYPE.
(decode_nlmsg_type): Add condition type >= NLMSG_MIN_TYPE.
(decode_nlmsg_flags): Add condition type < NLMSG_MIN_TYPE.
(decode_netlink_sock_diag): Add condition
nlmsghdr->nlmsg_type < NLMSG_MIN_TYPE.
---
 netlink.c           | 13 ++++++++-----
 netlink_sock_diag.c |  3 +++
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/netlink.c b/netlink.c
index 87b389c..d990fad 100644
--- a/netlink.c
+++ b/netlink.c
@@ -177,7 +177,7 @@ decode_nlmsg_type(const uint16_t type, const unsigned int family)
 	const struct xlat *xlat = netlink_types;
 	const char *dflt = "NLMSG_???";
 
-	if (family < ARRAY_SIZE(nlmsg_types)) {
+	if (type >= NLMSG_MIN_TYPE && family < ARRAY_SIZE(nlmsg_types)) {
 		if (nlmsg_types[family].decoder)
 			decoder = nlmsg_types[family].decoder;
 		if (nlmsg_types[family].xlat)
@@ -194,6 +194,11 @@ decode_nlmsg_flags(const uint16_t flags, const uint16_t type, const int family)
 {
 	const struct xlat *table = NULL;
 
+	if (type < NLMSG_MIN_TYPE) {
+		printflags(netlink_flags, flags, "NLM_F_???");
+		return;
+	}
+
 	switch (family) {
 	case NETLINK_SOCK_DIAG:
 		table = netlink_get_flags;
@@ -246,10 +251,8 @@ print_nlmsghdr(struct tcb *tcp,
 
 	tprintf("{len=%u, type=", nlmsghdr->nlmsg_len);
 
-	const int hdr_family = (nlmsghdr->nlmsg_type < NLMSG_MIN_TYPE)
-			       ? NL_FAMILY_DEFAULT
-			       : (family != NL_FAMILY_DEFAULT
-				  ? family : get_fd_nl_family(tcp, fd));
+	const int hdr_family = family != NL_FAMILY_DEFAULT
+			       ? family : get_fd_nl_family(tcp, fd);
 
 	decode_nlmsg_type(nlmsghdr->nlmsg_type, hdr_family);
 
diff --git a/netlink_sock_diag.c b/netlink_sock_diag.c
index d854808..ab09bd1 100644
--- a/netlink_sock_diag.c
+++ b/netlink_sock_diag.c
@@ -536,6 +536,9 @@ decode_netlink_sock_diag(struct tcb *const tcp,
 {
 	uint8_t family;
 
+	if (nlmsghdr->nlmsg_type < NLMSG_MIN_TYPE)
+		return false;
+
 	if (!umove_or_printaddr(tcp, addr, &family)) {
 		if (family < ARRAY_SIZE(diag_decoders)
 		    && len > sizeof(family)) {
-- 
2.7.4





More information about the Strace-devel mailing list