From: Dmitry V. Levin Date: Fri, 19 Feb 2016 01:30:34 +0000 (+0000) Subject: Change unix_diag requests back to use full dump instead of exact match X-Git-Tag: v4.12~536 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=10c61e3b2213a63f3b5ada623cd17968d22f99b3;p=strace Change unix_diag requests back to use full dump instead of exact match Unfortunately, 64-bit linux kernel has a bug in matching inode numbers greater than INT_MAX, so unix_diag exact match is not reliable. This partially reverts commit 69bfc89770152033d4aa0bc5673fc46e65d89838. * socketutils.c (unix_send_query): Add NLM_F_DUMP to nlmsg_flags, remove initialization of udiag_cookie. * tests/netlink_unix_diag.c (send_query): Remove "inode" argument, add NLM_F_DUMP to nlmsg_flags, remove initialization of udiag_ino and udiag_cookie. (check_responses): Remove "inode" argument and its use. (main): Remove invocation of inode_of_sockfd and passing of listening socket inode to send_query and check_responses. --- diff --git a/socketutils.c b/socketutils.c index 43758424..640c6732 100644 --- a/socketutils.c +++ b/socketutils.c @@ -242,14 +242,13 @@ unix_send_query(const int fd, const unsigned long inode) .nlh = { .nlmsg_len = sizeof(req), .nlmsg_type = SOCK_DIAG_BY_FAMILY, - .nlmsg_flags = NLM_F_REQUEST + .nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST }, .udr = { .sdiag_family = AF_UNIX, .udiag_ino = inode, .udiag_states = -1, - .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER, - .udiag_cookie = { ~0U, ~0U } + .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER } }; struct iovec iov = { diff --git a/tests/netlink_unix_diag.c b/tests/netlink_unix_diag.c index 932a9e18..5d760a25 100644 --- a/tests/netlink_unix_diag.c +++ b/tests/netlink_unix_diag.c @@ -45,7 +45,7 @@ #endif static void -send_query(const int fd, const unsigned int inode) +send_query(const int fd) { struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK @@ -57,14 +57,12 @@ send_query(const int fd, const unsigned int inode) .nlh = { .nlmsg_len = sizeof(req), .nlmsg_type = SOCK_DIAG_BY_FAMILY, - .nlmsg_flags = NLM_F_REQUEST + .nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP }, .udr = { .sdiag_family = AF_UNIX, - .udiag_ino = inode, .udiag_states = -1, - .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER, - .udiag_cookie = { ~0U, ~0U } + .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER } }; struct iovec iov = { @@ -83,7 +81,7 @@ send_query(const int fd, const unsigned int inode) } static void -check_responses(const int fd, const unsigned int inode) +check_responses(const int fd) { static char buf[8192]; struct sockaddr_nl nladdr = { @@ -121,8 +119,6 @@ check_responses(const int fd, const unsigned int inode) const struct unix_diag_msg *diag = NLMSG_DATA(h); if (h->nlmsg_len < NLMSG_LENGTH(sizeof(*diag))) error_msg_and_skip("short response"); - if (diag->udiag_ino != inode) - error_msg_and_skip("inode mismatch"); } #define SUN_PATH "netlink_unix_diag_socket" @@ -150,8 +146,7 @@ int main(void) if (socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG) != 1) perror_msg_and_skip("socket AF_NETLINK"); - unsigned int inode = inode_of_sockfd(0); - send_query(1, inode); - check_responses(1, inode); + send_query(1); + check_responses(1); return 0; }