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.
This commit is contained in:
Daniel Silverstone 2007-10-19 13:32:24 +02:00 committed by Stephen Hemminger
parent 3a9e4821b6
commit 7b3d366e06
1 changed files with 5 additions and 1 deletions

View File

@ -35,6 +35,8 @@
#include "ll_map.h" #include "ll_map.h"
#include "ip_common.h" #include "ip_common.h"
#define MAX_ROUNDS 10
static struct static struct
{ {
int ifindex; int ifindex;
@ -684,7 +686,7 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush)
filter.flushp = 0; filter.flushp = 0;
filter.flushe = sizeof(flushb); filter.flushe = sizeof(flushb);
for (;;) { while (round < MAX_ROUNDS) {
if (rtnl_wilddump_request(&rth, filter.family, RTM_GETADDR) < 0) { if (rtnl_wilddump_request(&rth, filter.family, RTM_GETADDR) < 0) {
perror("Cannot send dump request"); perror("Cannot send dump request");
exit(1); exit(1);
@ -711,6 +713,8 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush)
fflush(stdout); fflush(stdout);
} }
} }
fprintf(stderr, "*** Flush remains incomplete after %d rounds. ***\n", MAX_ROUNDS); fflush(stderr);
return 1;
} }
if (filter.family != AF_PACKET) { if (filter.family != AF_PACKET) {