Add the number of struct tcp_info bytes read from Netlink
This patch adds to the SockDiag TcpInfoReader callback the number of
bytes read from Netlink when parsing a struct tcp_info attribute with
attribute id INET_DIAG_INFO.
On different kernels, struct tcp_info will have different fields and
different sizes when serialized. A generic sock_diag struct tcp_info
handler can use the attribute byte size to distinguish between different
fields and safely read data inside struct tcp_info.
Bug: 64147860
Test: tested manually on sailfish with 3.18 kernel,
using $ adb shell dumpsys netd tcp_socket_info
Change-Id: I45da9ed787dc7f0c4873ce1132b5f8094bcffd0a
diff --git a/server/SockDiag.cpp b/server/SockDiag.cpp
index d2bf49e..32fec6e 100644
--- a/server/SockDiag.cpp
+++ b/server/SockDiag.cpp
@@ -218,12 +218,14 @@
NetlinkDumpCallback callback = [tcpInfoReader] (nlmsghdr *nlh) {
Fwmark mark;
struct tcp_info *tcpinfo = nullptr;
+ uint32_t tcpinfoLength = 0;
inet_diag_msg *msg = reinterpret_cast<inet_diag_msg *>(NLMSG_DATA(nlh));
uint32_t attr_len = nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*msg));
struct rtattr *attr = reinterpret_cast<struct rtattr*>(msg+1);
while (RTA_OK(attr, attr_len)) {
if (attr->rta_type == INET_DIAG_INFO) {
tcpinfo = reinterpret_cast<struct tcp_info*>(RTA_DATA(attr));
+ tcpinfoLength = RTA_PAYLOAD(attr);
}
if (attr->rta_type == INET_DIAG_MARK) {
mark.intValue = *reinterpret_cast<uint32_t*>(RTA_DATA(attr));
@@ -231,7 +233,7 @@
attr = RTA_NEXT(attr, attr_len);
}
- tcpInfoReader(mark, msg, tcpinfo);
+ tcpInfoReader(mark, msg, tcpinfo, tcpinfoLength);
};
return processNetlinkDump(mSock, callback);