diff options
Diffstat (limited to 'networking/traceroute.c')
-rw-r--r-- | networking/traceroute.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/networking/traceroute.c b/networking/traceroute.c index 8ab4caefe..c1eb2d92e 100644 --- a/networking/traceroute.c +++ b/networking/traceroute.c | |||
@@ -659,9 +659,11 @@ packet4_ok(int read_len, int seq) | |||
659 | 659 | ||
660 | if ((option_mask32 & OPT_USE_ICMP) | 660 | if ((option_mask32 & OPT_USE_ICMP) |
661 | && type == ICMP_ECHOREPLY | 661 | && type == ICMP_ECHOREPLY |
662 | && icp->icmp_id == ident | ||
663 | && icp->icmp_seq == htons(seq) | 662 | && icp->icmp_seq == htons(seq) |
664 | ) { | 663 | ) { |
664 | if (icp->icmp_id != ident) | ||
665 | /* reply to another ping/traceroute from this box? */ | ||
666 | return 0; /* ignore, silently */ | ||
665 | /* In UDP mode, when we reach the machine, we (usually) | 667 | /* In UDP mode, when we reach the machine, we (usually) |
666 | * would get "port unreachable" - in ICMP we got "echo reply". | 668 | * would get "port unreachable" - in ICMP we got "echo reply". |
667 | * Simulate "port unreachable" for caller: | 669 | * Simulate "port unreachable" for caller: |
@@ -726,9 +728,11 @@ packet6_ok(int read_len, int seq) | |||
726 | 728 | ||
727 | if ((option_mask32 & OPT_USE_ICMP) | 729 | if ((option_mask32 & OPT_USE_ICMP) |
728 | && type == ICMP6_ECHO_REPLY | 730 | && type == ICMP6_ECHO_REPLY |
729 | && icp->icmp6_id == ident | ||
730 | && icp->icmp6_seq == htons(seq) | 731 | && icp->icmp6_seq == htons(seq) |
731 | ) { | 732 | ) { |
733 | if (icp->icmp6_id != ident) | ||
734 | /* reply to another ping/traceroute from this box? */ | ||
735 | return 0; /* ignore, silently */ | ||
732 | /* In UDP mode, when we reach the machine, we (usually) | 736 | /* In UDP mode, when we reach the machine, we (usually) |
733 | * would get "port unreachable" - in ICMP we got "echo reply". | 737 | * would get "port unreachable" - in ICMP we got "echo reply". |
734 | * Simulate "port unreachable" for caller: | 738 | * Simulate "port unreachable" for caller: |
@@ -988,6 +992,11 @@ traceroute_init(int op, char **argv) | |||
988 | outip = xzalloc(packlen); | 992 | outip = xzalloc(packlen); |
989 | 993 | ||
990 | ident = getpid(); | 994 | ident = getpid(); |
995 | /* we can use native-endian ident, but other Unix ping/traceroute | ||
996 | * utils use *big-endian pid*, and e.g. ping on our machine may be | ||
997 | * *not* from busybox, idents may collide. Follow the convention: | ||
998 | */ | ||
999 | ident = htons(ident); | ||
991 | 1000 | ||
992 | outdata = (void*)(outudp + 1); | 1001 | outdata = (void*)(outudp + 1); |
993 | if (af == AF_INET) { | 1002 | if (af == AF_INET) { |