diff options
author | Singh <sunjeets@amazon.com> | 2016-11-11 14:03:02 -0800 |
---|---|---|
committer | Singh <sunjeets@amazon.com> | 2016-11-15 11:18:17 -0800 |
commit | f7710a17c4d5994313a64583f511bcdb9559f2a9 (patch) | |
tree | 8e0b85e54fce6b2d30e9168f26f49134987ea4c3 | |
parent | bffc0e957b98d626ab4cea218c89251201425442 (diff) | |
download | iputils-f7710a17c4d5994313a64583f511bcdb9559f2a9.tar.gz |
Add strict pattern matching on response when pattern was provided
Signed-off-by: Singh <sstattla@gmail.com>
-rw-r--r-- | ping.c | 2 | ||||
-rw-r--r-- | ping.h | 1 | ||||
-rw-r--r-- | ping6_common.c | 2 | ||||
-rw-r--r-- | ping_common.c | 18 |
4 files changed, 23 insertions, 0 deletions
@@ -1103,6 +1103,8 @@ ping4_parse_reply(struct socket_st *sock, struct msghdr *msg, int cc, void *addr if (icp->type == ICMP_ECHOREPLY) { if (!is_ours(sock, icp->un.echo.id)) return 1; /* 'Twas not our ECHO */ + if (!contains_pattern_in_payload((__u8*)(icp+1))) + return 1; /* 'Twas really not our ECHO */ if (gather_statistics((__u8*)icp, sizeof(*icp), cc, ntohs(icp->un.echo.sequence), ttl, 0, tv, pr_addr(from, sizeof *from), @@ -313,6 +313,7 @@ extern ping_func_set_st ping4_func_set; extern int pinger(ping_func_set_st *fset, socket_st *sock); extern void sock_setbufs(socket_st*, int alloc); extern void setup(socket_st *); +extern int contains_pattern_in_payload(__u8 *ptr); extern void main_loop(ping_func_set_st *fset, socket_st*, __u8 *buf, int buflen) __attribute__((noreturn)); extern void finish(void) __attribute__((noreturn)); extern void status(void); diff --git a/ping6_common.c b/ping6_common.c index 498e590..a5627ae 100644 --- a/ping6_common.c +++ b/ping6_common.c @@ -1420,6 +1420,8 @@ ping6_parse_reply(socket_st *sock, struct msghdr *msg, int cc, void *addr, struc if (icmph->icmp6_type == ICMP6_ECHO_REPLY) { if (!is_ours(sock, icmph->icmp6_id)) return 1; + if (!contains_pattern_in_payload((__u8*)(icmph+1))) + return 1; /* 'Twas really not our ECHO */ if (gather_statistics((__u8*)icmph, sizeof(*icmph), cc, ntohs(icmph->icmp6_seq), hops, 0, tv, pr_addr(from, sizeof *from), diff --git a/ping_common.c b/ping_common.c index 7ea1fb3..0b32d6a 100644 --- a/ping_common.c +++ b/ping_common.c @@ -565,6 +565,24 @@ void setup(socket_st *sock) } } +/* + * Return 0 if pattern in payload point to be ptr did not match the pattern that was sent + */ +int contains_pattern_in_payload(__u8 *ptr) +{ + int i; + __u8 *cp, *dp; + + /* check the data */ + cp = ((u_char*)ptr) + sizeof(struct timeval); + dp = &outpack[8 + sizeof(struct timeval)]; + for (i = sizeof(struct timeval); i < datalen; ++i, ++cp, ++dp) { + if (*cp != *dp) + return 0; + } + return 1; +} + void main_loop(ping_func_set_st *fset, socket_st *sock, __u8 *packet, int packlen) { char addrbuf[128]; |