traceroute(8) never sees a timeout when poll(2) returns when it receives a packet not intended for us. E.g. a ping(8) is running in parallel. In this case we need to account for the time we already waited. Pointed out by Gabriel Nieto on bugs@, thanks!
OK? diff --git traceroute.c traceroute.c index 1444de11f9e..7c6f69c21c5 100644 --- traceroute.c +++ traceroute.c @@ -297,6 +297,7 @@ u_char proto = IPPROTO_UDP; int verbose; int waittime = 5; /* time to wait for response (in seconds) */ +int curwaittime; /* time left to wait for response */ int nflag; /* print addresses numerically */ int dump; int Aflag; /* lookup ASN */ @@ -838,13 +839,20 @@ main(int argc, char *argv[]) gettime(&t1); send_probe(++seq, ttl, incflag, to); + curwaittime = waittime * 1000; while ((cc = wait_for_reply(rcvsock, &rcvmhdr))) { gettime(&t2); i = packet_ok(to->sa_family, &rcvmhdr, cc, seq, incflag); - /* Skip short packet */ - if (i == 0) + /* Skip wrong packet */ + if (i == 0) { + curwaittime = waittime * 1000 - + ((t2.tv_sec - t1.tv_sec) * 1000 + + (t2.tv_usec - t1.tv_usec) / 1000); + if (curwaittime < 0) + curwaittime = 0; continue; + } if (to->sa_family == AF_INET) { ip = (struct ip *)packet; if (from4.sin_addr.s_addr != lastaddr) { diff --git traceroute.h traceroute.h index 8b9e435c119..419168c2b4e 100644 --- traceroute.h +++ traceroute.h @@ -137,7 +137,7 @@ extern u_char proto; #define ICMP_CODE 0; extern int verbose; -extern int waittime; /* time to wait for response (in seconds) */ +extern int curwaittime; /* time left to wait for response */ extern int nflag; /* print addresses numerically */ extern int dump; extern int Aflag; /* lookup ASN */ diff --git worker.c worker.c index d27e82abd52..7d0ad0fe496 100644 --- worker.c +++ worker.c @@ -227,7 +227,7 @@ wait_for_reply(int sock, struct msghdr *mhdr) pfd[0].events = POLLIN; pfd[0].revents = 0; - if (poll(pfd, 1, waittime * 1000) > 0) + if (poll(pfd, 1, curwaittime) > 0) cc = recvmsg(rcvsock, mhdr, 0); return (cc); -- I'm not entirely sure you are real.