From 7b3d366e0677c53767fca6b59677ee356b65b6da Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Fri, 19 Oct 2007 13:32:24 +0200 Subject: [PATCH] Avoid infinite loop in ip addr flush. Fix "ip addr flush" the same way "ip neigh flush" was previously fixed, by bailing out if the flush hasn't completed after MAX_ROUNDS (10) tries. --- ip/ipaddress.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ip/ipaddress.c b/ip/ipaddress.c index 59c71c83..373312f2 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -35,6 +35,8 @@ #include "ll_map.h" #include "ip_common.h" +#define MAX_ROUNDS 10 + static struct { int ifindex; @@ -684,7 +686,7 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush) filter.flushp = 0; filter.flushe = sizeof(flushb); - for (;;) { + while (round < MAX_ROUNDS) { if (rtnl_wilddump_request(&rth, filter.family, RTM_GETADDR) < 0) { perror("Cannot send dump request"); exit(1); @@ -711,6 +713,8 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush) fflush(stdout); } } + fprintf(stderr, "*** Flush remains incomplete after %d rounds. ***\n", MAX_ROUNDS); fflush(stderr); + return 1; } if (filter.family != AF_PACKET) {