[iputils] Ping fixes: + integer overflow (#834661) + Fallback to numeric addresses while exiting (#834661)

jsynacek jsynacek at fedoraproject.org
Tue Jun 26 07:44:44 UTC 2012


commit 6d1533c8b4dd981c7e3856e3d5300045c37128e7
Author: Jan Synacek <jsynacek at redhat.com>
Date:   Tue Jun 26 09:39:29 2012 +0200

    Ping fixes:
      + integer overflow (#834661)
      + Fallback to numeric addresses while exiting (#834661)

 ...llback-to-numeric-addresses-while-exiting.patch |   75 ++++++++++++++++++++
 iputils-20101006-ping-integer-overflow.patch       |   11 +++
 iputils.spec                                       |    6 ++
 3 files changed, 92 insertions(+), 0 deletions(-)
---
diff --git a/iputils-20101006-ping-fallback-to-numeric-addresses-while-exiting.patch b/iputils-20101006-ping-fallback-to-numeric-addresses-while-exiting.patch
new file mode 100644
index 0000000..58e6002
--- /dev/null
+++ b/iputils-20101006-ping-fallback-to-numeric-addresses-while-exiting.patch
@@ -0,0 +1,75 @@
+--- iputils-s20101006/ping.c	2012-06-25 09:43:53.247390215 +0200
++++ iputils-s20101006-patch/ping.c	2012-06-25 09:46:01.333436372 +0200
+@@ -1243,12 +1243,17 @@ pr_addr(__u32 addr)
+ 	addr_cache = addr;
+ 	tmp_addr.s_addr = addr;
+ 
+-	if ((options & F_NUMERIC) ||
++	in_pr_addr = !setjmp(pr_addr_jmp);
++
++	if (exiting || (options & F_NUMERIC) ||
+ 	    !(hp = gethostbyaddr((char *)&addr, 4, AF_INET)))
+ 		sprintf(buf, "%s", inet_ntoa(tmp_addr));
+ 	else
+ 		snprintf(buf, sizeof(buf), "%s (%s)", hp->h_name,
+ 			 inet_ntoa(tmp_addr));
++
++	in_pr_addr = 0;
++
+ 	return(buf);
+ }
+ 
+--- iputils-s20101006/ping6.c	2012-06-25 09:43:53.233390208 +0200
++++ iputils-s20101006-patch/ping6.c	2012-06-25 09:46:52.437450591 +0200
+@@ -1565,9 +1565,13 @@ char * pr_addr(struct in6_addr *addr)
+ 		return hp ? hp->h_name : pr_addr_n(addr);
+ 	memcpy(&addr_cache, addr, sizeof(addr_cache));
+ 
+-	if (!(options&F_NUMERIC))
++	in_pr_addr = !setjmp(pr_addr_jmp);
++
++	if (!(exiting || options&F_NUMERIC))
+ 		hp = gethostbyaddr((__u8*)addr, sizeof(struct in6_addr), AF_INET6);
+ 
++	in_pr_addr = 0;
++
+ 	return hp ? hp->h_name : pr_addr_n(addr);
+ }
+ 
+--- iputils-s20101006/ping_common.h	2012-06-25 09:43:53.249390215 +0200
++++ iputils-s20101006-patch/ping_common.h	2012-06-25 09:47:24.002458261 +0200
+@@ -16,6 +16,7 @@
+ #include <errno.h>
+ #include <string.h>
+ #include <netdb.h>
++#include <setjmp.h>
+ 
+ #ifdef HAVE_CAPABILITIES
+ #include <sys/capability.h>
+@@ -219,3 +220,6 @@ extern int gather_statistics(__u8 *ptr,
+ 			     int csfailed, struct timeval *tv, char *from,
+ 			     void (*pr_reply)(__u8 *ptr, int cc));
+ extern void print_timestamp(void);
++
++extern int in_pr_addr;
++extern jmp_buf pr_addr_jmp;
+--- iputils-s20101006/ping_common.c	2012-06-25 09:43:53.252390217 +0200
++++ iputils-s20101006-patch/ping_common.c	2012-06-25 09:49:04.972477402 +0200
+@@ -32,6 +32,8 @@ struct timeval start_time, cur_time;
+ volatile int exiting;
+ volatile int status_snapshot;
+ int confirm = 0;
++int in_pr_addr = 0;		/* pr_addr() is executing */
++jmp_buf pr_addr_jmp;
+ 
+ /* Stupid workarounds for bugs/missing functionality in older linuces.
+  * confirm_flag fixes refusing service of kernels without MSG_CONFIRM.
+@@ -252,6 +254,8 @@ void common_options(int ch)
+ static void sigexit(int signo)
+ {
+ 	exiting = 1;
++	if (in_pr_addr)
++		longjmp(pr_addr_jmp, 0);
+ }
+ 
+ static void sigstatus(int signo)
diff --git a/iputils-20101006-ping-integer-overflow.patch b/iputils-20101006-ping-integer-overflow.patch
new file mode 100644
index 0000000..720e5e8
--- /dev/null
+++ b/iputils-20101006-ping-integer-overflow.patch
@@ -0,0 +1,11 @@
+--- iputils-s20101006/ping_common.c	2010-10-06 13:59:20.000000000 +0200
++++ iputils-s20101006-patched/ping_common.c	2012-03-09 16:42:46.878151032 +0100
+@@ -590,7 +590,7 @@
+ 
+ 			/* If we are here, recvmsg() is unable to wait for
+ 			 * required timeout. */
+-			if (1000*next <= 1000000/(int)HZ) {
++			if (((uint64_t)1000*next) <= (uint64_t)1000000/(int)HZ) {
+ 				/* Very short timeout... So, if we wait for
+ 				 * something, we sleep for MININTERVAL.
+ 				 * Otherwise, spin! */
diff --git a/iputils.spec b/iputils.spec
index a14b3a0..a6dc3d2 100644
--- a/iputils.spec
+++ b/iputils.spec
@@ -32,6 +32,8 @@ Patch16: iputils-20101006-man.patch
 Patch17: iputils-20101006-eth.patch
 Patch18: iputils-20101006-rr.patch
 Patch20: iputils-20101006-ping-defer-caps-drop-when-marking-packets.patch
+Patch21: iputils-20101006-ping-integer-overflow.patch
+Patch22: iputils-20101006-ping-fallback-to-numeric-addresses-while-exiting.patch
 
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires: docbook-utils perl-SGMLSpm
@@ -90,6 +92,8 @@ The iputils-sysvinit contains SysV initscritps support.
 %patch17 -p1 -b .eth
 %patch18 -p1 -b .rr
 %patch20 -p1
+%patch21 -p1
+%patch22 -p1
 
 %build
 %ifarch s390 s390x
@@ -196,6 +200,8 @@ rm -rf ${RPM_BUILD_ROOT}
 * Mon Jun 25 2012 Jan Synáček <jsynacek at redhat.com> 20101006-15
 - Ping fixes:
   + enable marking packets when the correct capabilities are set (#802197)
+  + integer overflow (#834661)
+  + Fallback to numeric addresses while exiting (#834661)
 
 * Wed Jan 25 2012 Harald Hoyer <harald at redhat.com> 20101006-14
 - install everything in /usr


More information about the scm-commits mailing list