Blame SOURCES/0006-ping-Fix-unwanted-bell-on-unreachable-address.patch

633df3
From dc4f836759887a6edf141aa55adbdb9bc63f5e69 Mon Sep 17 00:00:00 2001
633df3
From: Jan Macku <jamacku@redhat.com>
633df3
Date: Tue, 22 Mar 2022 12:59:21 +0100
633df3
Subject: [PATCH] ping: Fix unwanted bell on unreachable address
633df3
633df3
Commit 4471ac629cf2603f4b8b45e042e072c992ce25a5 caused regression for IPv6
633df3
that ping -a IP6_ADDR beeps also on wrong address (i.e.  when "Address
633df3
unreachable"):
633df3
633df3
    $ ping -a -c1 fd00:1:1:1::15
633df3
    PING fd00:1:1:1::15(fd00:1:1:1::15) 56 data bytes
633df3
    From fd00:1:1:1::2 icmp_seq=1 Destination unreachable: Address unreachable
633df3
633df3
    --- fd00:1:1:1::15 ping statistics ---
633df3
    1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0m
633df3
633df3
It should only bell when ping returns correctly.
633df3
633df3
Another (fixed) regression was that ping after exit printed error "pipe N",
633df3
where N is number of counts. Error was result of code from ping_common.c:
633df3
printf("%spipe %d", comma, pipesize);
633df3
633df3
4471ac6 was wrong that code for sock->working_recverr == 1 should stay,
633df3
sock->working_recverr should be removed.
633df3
633df3
Thus changes:
633df3
* ping.c: put back "stronger filter" for raw socket but (unlike before
633df3
  4471ac6) exit with 2 if setsockopt(ICMP_FILTER) fails
633df3
* ping6_common.c: put back setsockopt(IPV6_RECVERR), but (unlike before
633df3
  4471ac6) exit with 2 if it fails
633df3
* ping6_common.c: remove ICMP6_FILTER_SETPASS calls. These caused error "pipe N".
633df3
* ping6_common.c: return 0 after acknowledge() in ping6_parse_reply
633df3
633df3
Fixes: 4471ac6 ("ping: Remove workaround for bug in IP_RECVERR on raw sockets")
633df3
Fixes: https://github.com/iputils/iputils/issues/182
633df3
Reported-by: Luiz Angelo Daros de Luca <luizluca@tre-sc.jus.br>
633df3
Signed-off-by: Petr Vorel <pvorel@suse.cz>
633df3
Reviewed-by: Sami Kerola <kerolasa@iki.fi>
633df3
633df3
---
633df3
Patch has been adjusted to be applicable to RHEL8 codebase
633df3
633df3
Resolves: #2057570
633df3
---
633df3
 ping.c         | 11 +++++++++++
633df3
 ping6_common.c | 15 +++------------
633df3
 2 files changed, 14 insertions(+), 12 deletions(-)
633df3
633df3
diff --git a/ping.c b/ping.c
633df3
index d9a3f5d..c870390 100644
633df3
--- a/ping.c
633df3
+++ b/ping.c
633df3
@@ -949,6 +949,17 @@ int ping4_receive_error_msg(socket_st *sock)
633df3
 
633df3
 		acknowledge(ntohs(icmph.un.echo.sequence));
633df3
 
633df3
+		if (sock->socktype == SOCK_RAW)
633df3
+		{
633df3
+			struct icmp_filter filt;
633df3
+
633df3
+			filt.data = ~((1 << ICMP_SOURCE_QUENCH) |
633df3
+						  (1 << ICMP_REDIRECT) |
633df3
+						  (1 << ICMP_ECHOREPLY));
633df3
+			if (setsockopt(sock->fd, SOL_RAW, ICMP_FILTER, (const void *)&filt,
633df3
+						   sizeof(filt)) == -1)
633df3
+				error(2, errno, "setsockopt(ICMP_FILTER)");
633df3
+		}
633df3
 		net_errors++;
633df3
 		nerrors++;
633df3
 		if (options & F_QUIET)
633df3
diff --git a/ping6_common.c b/ping6_common.c
633df3
index 5991c2a..1181341 100644
633df3
--- a/ping6_common.c
633df3
+++ b/ping6_common.c
633df3
@@ -879,6 +879,8 @@ int ping6_run(int argc, char **argv, struct addrinfo *ai, struct socket_st *sock
633df3
 	}
633df3
 
633df3
 	hold = 1;
633df3
+	if (setsockopt(sock->fd, IPPROTO_IPV6, IPV6_RECVERR, (const void *)&hold, sizeof hold))
633df3
+		error(2, errno, "IPV6_RECVERR");
633df3
 
633df3
 	/* Estimate memory eaten by single packet. It is rough estimate.
633df3
 	 * Actually, for small datalen's it depends on kernel side a lot. */
633df3
@@ -906,11 +908,6 @@ int ping6_run(int argc, char **argv, struct addrinfo *ai, struct socket_st *sock
633df3
 
633df3
 		ICMP6_FILTER_SETBLOCKALL(&filter);
633df3
 
633df3
-		ICMP6_FILTER_SETPASS(ICMP6_DST_UNREACH, &filter);
633df3
-		ICMP6_FILTER_SETPASS(ICMP6_PACKET_TOO_BIG, &filter);
633df3
-		ICMP6_FILTER_SETPASS(ICMP6_TIME_EXCEEDED, &filter);
633df3
-		ICMP6_FILTER_SETPASS(ICMP6_PARAM_PROB, &filter);
633df3
-
633df3
 		if (niquery_is_enabled())
633df3
 			ICMP6_FILTER_SETPASS(ICMPV6_NI_REPLY, &filter);
633df3
 		else
633df3
@@ -1437,13 +1434,7 @@ ping6_parse_reply(socket_st *sock, struct msghdr *msg, int cc, void *addr, struc
633df3
 			    !is_ours(sock, icmph1->icmp6_id))
633df3
 				return 1;
633df3
 			acknowledge(ntohs(icmph1->icmp6_seq));
633df3
-			nerrors++;
633df3
-			if (options & F_FLOOD) {
633df3
-				write_stdout("\bE", 2);
633df3
-				return 0;
633df3
-			}
633df3
-			print_timestamp();
633df3
-			printf("From %s: icmp_seq=%u ", pr_addr(from, sizeof *from), ntohs(icmph1->icmp6_seq));
633df3
+			return 0;
633df3
 		} else {
633df3
 			/* We've got something other than an ECHOREPLY */
633df3
 			if (!(options & F_VERBOSE) || uid)
633df3
-- 
633df3
2.35.1
633df3