* netlink.c: Include "nlattr.h" and "xlat/nlmsgerr_attrs.h". (print_cookie, decode_nlmsgerr_attr_cookie): New functions. (nlmsgerr_nla_decoders): New array. (decode_nlmsgerr): Use it. * xlat/nlmsgerr_attrs.in: New file. * NEWS: Mention this. --- NEWS | 1 + netlink.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ xlat/nlmsgerr_attrs.in | 4 ++++ 3 files changed, 49 insertions(+) create mode 100644 xlat/nlmsgerr_attrs.in
diff --git a/NEWS b/NEWS index e09e10f..bb199cb 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ Noteworthy changes in release ?.?? (????-??-??) packet_diag_msg, and smc_diag_msg netlink attributes of NETLINK_SOCK_DIAG. * Implemented NETLINK_SELINUX protocol specific decoding. * Implemented decoding of netlink message ack flags. + * Implemented decoding of nlmsgerr netlink attributes. * Updated lists of BPF_*, RWF_*, SCM_*, and SO_* constants. * Bug fixes diff --git a/netlink.c b/netlink.c index fc440da..7e1154b 100644 --- a/netlink.c +++ b/netlink.c @@ -29,6 +29,7 @@ #include "defs.h" #include "netlink.h" +#include "nlattr.h" #include <linux/audit.h> #include <linux/rtnetlink.h> #include <linux/xfrm.h> @@ -46,6 +47,7 @@ #include "xlat/nl_selinux_types.h" #include "xlat/nl_sock_diag_types.h" #include "xlat/nl_xfrm_types.h" +#include "xlat/nlmsgerr_attrs.h" /* * Fetch a struct nlmsghdr from the given address. @@ -284,6 +286,38 @@ print_nlmsghdr(struct tcb *tcp, return family != NL_FAMILY_DEFAULT ? family : hdr_family; } +static bool +print_cookie(struct tcb *const tcp, + void *const elem_buf, + const size_t elem_size, + void *const opaque_data) +{ + tprintf("%" PRIu8, *(uint8_t *) elem_buf); + + return true; +} + +static bool +decode_nlmsgerr_attr_cookie(struct tcb *const tcp, + const kernel_ulong_t addr, + const kernel_ulong_t len, + const void *const opaque_data) +{ + uint8_t cookie; + const size_t nmemb = len / sizeof(cookie); + + print_array(tcp, addr, nmemb, &cookie, sizeof(cookie), + umoven_or_printaddr, print_cookie, 0); + + return true; +} + +static const nla_decoder_t nlmsgerr_nla_decoders[] = { + [NLMSGERR_ATTR_MSG] = decode_nla_str, + [NLMSGERR_ATTR_OFFS] = decode_nla_u32, + [NLMSGERR_ATTR_COOKIE] = decode_nlmsgerr_attr_cookie +}; + static void decode_nlmsghdr_with_payload(struct tcb *const tcp, const int fd, @@ -332,6 +366,16 @@ decode_nlmsgerr(struct tcb *const tcp, decode_nlmsghdr_with_payload(tcp, fd, family, &err.msg, addr, payload); } + + addr += payload; + len -= payload; + } + if (len) { + tprints(", "); + decode_nlattr(tcp, addr, len, + nlmsgerr_attrs, "NLMSGERR_ATTR_???", + nlmsgerr_nla_decoders, + ARRAY_SIZE(nlmsgerr_nla_decoders), NULL); } tprints("}"); diff --git a/xlat/nlmsgerr_attrs.in b/xlat/nlmsgerr_attrs.in new file mode 100644 index 0000000..589bc55 --- /dev/null +++ b/xlat/nlmsgerr_attrs.in @@ -0,0 +1,4 @@ +NLMSGERR_ATTR_UNUSED 0 +NLMSGERR_ATTR_MSG 1 +NLMSGERR_ATTR_OFFS 2 +NLMSGERR_ATTR_COOKIE 3 -- 2.7.4 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel