From: JingPiao Chen Date: Tue, 27 Jun 2017 08:16:56 +0000 (+0800) Subject: netlink: pass NLMSG_DONE messages to family specific payload decoders X-Git-Tag: v4.18~43 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=54aed210364ac763374c3500de054c30e48e3f26;p=strace netlink: pass NLMSG_DONE messages to family specific payload decoders While many NLMSG_DONE messages indeed have payload containing just one integer, there are exceptions. Handle this by passing payloads of NLMSG_DONE messages to family specific netlink payload decoders. * netlink.c (print_nlmsghdr): Do not skip family detection for nlmsg_type == NLMSG_DONE. (decode_nlmsg_type): Skip family specific type decoders for type == NLMSG_DONE. (decode_nlmsg_flags): Skip family specific decoding of flags for type == NLMSG_DONE. (decode_netlink_sock_diag): Skip for nlmsg_type == NLMSG_DONE. --- diff --git a/netlink.c b/netlink.c index 87b389c4..f74c3a07 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_DONE && family < ARRAY_SIZE(nlmsg_types)) { if (nlmsg_types[family].decoder) decoder = nlmsg_types[family].decoder; if (nlmsg_types[family].xlat) @@ -194,6 +194,9 @@ decode_nlmsg_flags(const uint16_t flags, const uint16_t type, const int family) { const struct xlat *table = NULL; + if (type == NLMSG_DONE) + goto end; + switch (family) { case NETLINK_SOCK_DIAG: table = netlink_get_flags; @@ -233,6 +236,7 @@ decode_nlmsg_flags(const uint16_t flags, const uint16_t type, const int family) break; } +end: printflags_ex(flags, "NLM_F_???", netlink_flags, table, NULL); } @@ -246,7 +250,8 @@ print_nlmsghdr(struct tcb *tcp, tprintf("{len=%u, type=", nlmsghdr->nlmsg_len); - const int hdr_family = (nlmsghdr->nlmsg_type < NLMSG_MIN_TYPE) + const int hdr_family = (nlmsghdr->nlmsg_type < NLMSG_MIN_TYPE + && nlmsghdr->nlmsg_type != NLMSG_DONE) ? NL_FAMILY_DEFAULT : (family != NL_FAMILY_DEFAULT ? family : get_fd_nl_family(tcp, fd)); diff --git a/netlink_sock_diag.c b/netlink_sock_diag.c index d854808e..4b096f87 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_DONE) + return false; + if (!umove_or_printaddr(tcp, addr, &family)) { if (family < ARRAY_SIZE(diag_decoders) && len > sizeof(family)) {