File ping6-Fix-device-binding.patch of Package iputils.24604
From cbb67570c37271480aa32b4032c0d742231a8b9a Mon Sep 17 00:00:00 2001
From: Duncan Eastoe <deastoe@vyatta.att-mail.com>
Date: Tue, 24 Apr 2018 13:38:58 +0100
Subject: [PATCH] ping6: Fix device binding
The use of the && operator instead of || within ping6_run() results
in only the first setsockopt() call for IPV6_PKTINFO/SO_BINDTODEVICE
getting executed if it returns success, rather than all setsockopt()
calls as intended.
Fixes #88
Signed-off-by: Duncan Eastoe <deastoe@vyatta.att-mail.com>
Reviewed-by: Petr Vorel <pvorel@suse.cz>
---
ping6_common.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/ping6_common.c b/ping6_common.c
index 498e590..63f68a3 100644
--- a/ping6_common.c
+++ b/ping6_common.c
@@ -795,12 +795,16 @@ int ping6_run(int argc, char **argv, struct addrinfo *ai, struct socket_st *sock
IN6_IS_ADDR_MC_LINKLOCAL(&firsthop.sin6_addr))
firsthop.sin6_scope_id = iface;
enable_capability_raw();
- if (
#ifdef IPV6_RECVPKTINFO
- setsockopt(probe_fd, IPPROTO_IPV6, IPV6_PKTINFO, &ipi, sizeof ipi) == -1 &&
- setsockopt(sock->fd, IPPROTO_IPV6, IPV6_PKTINFO, &ipi, sizeof ipi) == -1 &&
+ if (
+ setsockopt(probe_fd, IPPROTO_IPV6, IPV6_PKTINFO, &ipi, sizeof ipi) == -1 ||
+ setsockopt(sock->fd, IPPROTO_IPV6, IPV6_PKTINFO, &ipi, sizeof ipi) == -1) {
+ perror("setsockopt(IPV6_PKTINFO)");
+ exit(2);
+ }
#endif
- setsockopt(probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device)+1) == -1 &&
+ if (
+ setsockopt(probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device)+1) == -1 ||
setsockopt(sock->fd, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device)+1) == -1) {
perror("setsockopt(SO_BINDTODEVICE)");
exit(2);
--
2.36.1