summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSingh <sunjeets@amazon.com>2016-11-11 14:03:02 -0800
committerSingh <sunjeets@amazon.com>2016-11-15 11:18:17 -0800
commitf7710a17c4d5994313a64583f511bcdb9559f2a9 (patch)
tree8e0b85e54fce6b2d30e9168f26f49134987ea4c3
parentbffc0e957b98d626ab4cea218c89251201425442 (diff)
downloadiputils-f7710a17c4d5994313a64583f511bcdb9559f2a9.tar.gz
Add strict pattern matching on response when pattern was provided
Signed-off-by: Singh <sstattla@gmail.com>
-rw-r--r--ping.c2
-rw-r--r--ping.h1
-rw-r--r--ping6_common.c2
-rw-r--r--ping_common.c18
4 files changed, 23 insertions, 0 deletions
diff --git a/ping.c b/ping.c
index cfae0a5..6f67d2d 100644
--- a/ping.c
+++ b/ping.c
@@ -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),
diff --git a/ping.h b/ping.h
index 749f3ff..1253fa0 100644
--- a/ping.h
+++ b/ping.h
@@ -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];