static bool
unix_send_query(struct tcb *tcp, const int fd, const unsigned long inode)
{
+ /*
+ * The kernel bug was fixed in mainline by commit v4.5-rc6~35^2~11
+ * and backported to stable/linux-4.4.y by commit v4.4.4~297.
+ */
+ const uint16_t dump_flag =
+ os_release < KERNEL_VERSION(4, 4, 4) ? NLM_F_DUMP : 0;
+
struct {
const struct nlmsghdr nlh;
const struct unix_diag_req udr;
.nlh = {
.nlmsg_len = sizeof(req),
.nlmsg_type = SOCK_DIAG_BY_FAMILY,
- .nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST
+ .nlmsg_flags = NLM_F_REQUEST | dump_flag
},
.udr = {
.sdiag_family = AF_UNIX,
.udiag_ino = inode,
.udiag_states = -1,
- .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER
+ .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER,
+ .udiag_cookie = { ~0U, ~0U }
}
};
return send_query(tcp, fd, &req, sizeof(req));