From 8b01344caf5b1152e66d384f878758b0da4873a2 Mon Sep 17 00:00:00 2001 From: david Date: Thu, 15 Sep 2011 17:57:00 +0000 Subject: [PATCH] In build_{icmp,igmp}_raw, fill with zeros when data is NULL. This restores the previous behavior of these functions, which was broken in r24127, which itself was fixing another bug. r24127 solved the problem of --data-length appending zeroes, not random data, to ICMP and IGMP packets. But in doing so, it added a check that the data argument is not NULL. OS detection uses a data argument of NULL, expecting these functions to fill in zeroes in this case. The result of this was that the IE probes were being sent with empty payloads instead of 120 and 150 bytes. --- tcpip.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tcpip.cc b/tcpip.cc index 4e69e6a96..fc39b2e03 100644 --- a/tcpip.cc +++ b/tcpip.cc @@ -1034,9 +1034,12 @@ u8 *build_icmp_raw(const struct in_addr *source, } /* Copy the data over too */ - if (data && datalen) { + if (datalen > 0) { icmplen += MIN(dlen, datalen); - memcpy(datastart, data, MIN(dlen, datalen)); + if (data == NULL) + memset(datastart, 0, MIN(dlen, datalen)); + else + memcpy(datastart, data, MIN(dlen, datalen)); } /* Fill out the ping packet. All the ICMP types handled by this function have @@ -1140,10 +1143,12 @@ u8 *build_igmp_raw(const struct in_addr *source, fatal("Unknown igmp type (%d) in %s", ptype, __func__); } - /* Copy the data over too */ - if (data && datalen) { + if (datalen > 0) { igmplen += MIN(dlen, datalen); - memcpy(datastart, data, MIN(dlen, datalen)); + if (data == NULL) + memset(datastart, 0, MIN(dlen, datalen)); + else + memcpy(datastart, data, MIN(dlen, datalen)); } igmp.igmp_cksum = 0;