On Mon, Jan 09, 2017 at 04:43:03PM +0100, Gabriel Nieto wrote:
>          if you are doing ping to one host and some one else use the
> traceroute command, then traceroute command no timeout all the hops.

indeed, the problem is that poll(2) returns because it sees a packet that
is not for us. and then poll(2) is called with the same timeout as before
without taking into account the time we already waited.

This should fix the problem (on -current):

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.

Reply via email to