]> granicus.if.org Git - strace/commitdiff
netlink: adjust decode_nlmsgerr for extended ACK reporting
authorJingPiao Chen <chenjingpiao@gmail.com>
Wed, 19 Jul 2017 09:17:36 +0000 (17:17 +0800)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 19 Jul 2017 09:25:58 +0000 (09:25 +0000)
Extended ACK reporting introduced by linux kernel commit
v4.11-rc5-1382-g2d4bc93.

* netlink.h (NLM_F_CAPPED): New macro.
* netlink.c (decode_payload): Pass
nlmsghdr->nlmsg_flags & NLM_F_CAPPED to decode_nlmsgerr.
(decode_nlmsgerr): Adjust the length pass to
decode_nlmsghdr_with_payload.

netlink.c
netlink.h

index d3ad8b09030312cae13a9fb41f46bb00a63be80e..b0ae18d670107973f3022eab494a1a7b810ab2e2 100644 (file)
--- a/netlink.c
+++ b/netlink.c
@@ -297,7 +297,8 @@ decode_nlmsgerr(struct tcb *const tcp,
                const int fd,
                const int family,
                kernel_ulong_t addr,
-               kernel_ulong_t len)
+               kernel_ulong_t len,
+               const bool capped)
 {
        struct nlmsgerr err;
 
@@ -322,8 +323,13 @@ decode_nlmsgerr(struct tcb *const tcp,
        if (len) {
                tprints(", msg=");
                if (fetch_nlmsghdr(tcp, &err.msg, addr, len)) {
+                       unsigned int payload =
+                               capped ? sizeof(err.msg) : err.msg.nlmsg_len;
+                       if (payload > len)
+                               payload = len;
+
                        decode_nlmsghdr_with_payload(tcp, fd, family,
-                                                    &err.msg, addr, len);
+                                                    &err.msg, addr, payload);
                }
        }
 
@@ -344,7 +350,8 @@ decode_payload(struct tcb *const tcp,
               const kernel_ulong_t len)
 {
        if (nlmsghdr->nlmsg_type == NLMSG_ERROR) {
-               decode_nlmsgerr(tcp, fd, family, addr, len);
+               decode_nlmsgerr(tcp, fd, family, addr, len,
+                               nlmsghdr->nlmsg_flags & NLM_F_CAPPED);
                return;
        }
 
index 5943229a55115acdda214c692009fa11a9ecf169..31b7876b670340b26325c311d4838b665afc7629 100644 (file)
--- a/netlink.h
+++ b/netlink.h
 # define NETLINK_SOCK_DIAG 4
 #endif
 
+#ifndef NLM_F_CAPPED
+# define NLM_F_CAPPED  0x100
+#endif
+
 #undef NLMSG_HDRLEN
 #define NLMSG_HDRLEN ((unsigned int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))