icmp checksum patch (bug found by Niels Provos)

new release not quite ready yet
This commit is contained in:
obecian 2000-10-13 02:04:33 +00:00
parent 45480eeb0f
commit 3865cc190e

View File

@ -0,0 +1,267 @@
--- nemesis-proto_icmp.c.orig Mon Oct 9 18:28:38 2000
+++ nemesis-proto_icmp.c Mon Oct 9 18:29:34 2000
@@ -70,7 +70,7 @@ buildicmp()
0, /* IP payload size */
pkt + LIBNET_ETH_H); /* packet header memory */
- if (type == ICMP_ECHOREPLY) /* type = 0 */
+ if (type == ICMP_ECHOREPLY) { /* type = 0 */
libnet_build_icmp_echo(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
@@ -78,8 +78,11 @@ buildicmp()
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet memory header */
-
- if (type == ICMP_UNREACH) /* type = 3 */
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+ LIBNET_ICMP_ECHO_H + payload_s);
+ }
+ if (type == ICMP_UNREACH) { /* type = 3 */
libnet_build_icmp_unreach(type, /* ICMP type */
code, /* ICMP code */
0, /* ICMP original length */
@@ -93,8 +96,12 @@ buildicmp()
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet memory header */
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+ LIBNET_ICMP_UNREACH_H + payload_s);
+ }
- if (type == ICMP_REDIRECT) /* type = 5 */
+ if (type == ICMP_REDIRECT) { /* type = 5 */
libnet_build_icmp_redirect(type, /* ICMP type */
code, /* ICMP code */
gwy, /* preferred gateway */
@@ -109,8 +116,11 @@ buildicmp()
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
-
- if (type == ICMP_ECHO) /* type = 8 */
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+ LIBNET_ICMP_REDIRECT_H + payload_s);
+ }
+ if (type == ICMP_ECHO) { /* type = 8 */
libnet_build_icmp_echo(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
@@ -118,7 +128,11 @@ buildicmp()
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
- if (type == ICMP_TIMXCEED) /* type = 11 */
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+ LIBNET_ICMP_ECHO_H + payload_s);
+ }
+ if (type == ICMP_TIMXCEED) { /* type = 11 */
libnet_build_icmp_timeexceed(type, /* ICMP type */
code, /* ICMP code */
0, /* ICMP orig length */
@@ -132,7 +146,11 @@ buildicmp()
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
- if (type == ICMP_TSTAMP) /* type = 13 */
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+ LIBNET_ICMP_TIMXCEED_H + payload_s);
+ }
+ if (type == ICMP_TSTAMP) { /* type = 13 */
libnet_build_icmp_timestamp(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
@@ -143,8 +161,11 @@ buildicmp()
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
-
- if (type == ICMP_TSTAMPREPLY) /* type = 14 */
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+ LIBNET_ICMP_TS_H + payload_s);
+ }
+ if (type == ICMP_TSTAMPREPLY) { /* type = 14 */
libnet_build_icmp_timestamp(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
@@ -155,7 +176,11 @@ buildicmp()
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
- if (type == ICMP_MASKREQ) /* type = 17 */
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+ LIBNET_ICMP_TS_H + payload_s);
+ }
+ if (type == ICMP_MASKREQ) { /* type = 17 */
libnet_build_icmp_mask(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
@@ -164,7 +189,11 @@ buildicmp()
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
- if (type == ICMP_MASKREPLY) /* type = 18 */
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+ LIBNET_ICMP_MASK_H + payload_s);
+ }
+ if (type == ICMP_MASKREPLY) { /* type = 18 */
libnet_build_icmp_mask(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
@@ -173,10 +202,10 @@ buildicmp()
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
pkt + LIBNET_ETH_H + LIBNET_IP_H); /* packet header memory */
-
- libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
- libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP, ICMP_S +
- payload_s);
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_IP, LIBNET_IP_H);
+ libnet_do_checksum(pkt + LIBNET_ETH_H, IPPROTO_ICMP,
+ LIBNET_ICMP_MASK_H + payload_s);
+ }
memcpy(ipopt.ipopt_list, options, option_s);
*(ipopt.ipopt_list) = IPOPT_SECURITY;
*(ipopt.ipopt_list + 1) = 1;
@@ -211,16 +240,17 @@ buildicmp()
0, /* IP payload size */
pkt); /* packet header memory */
- if (type == ICMP_ECHOREPLY) /* type = 0 */
+ if (type == ICMP_ECHOREPLY) { /* type = 0 */
libnet_build_icmp_echo(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
seq, /* sequence number */
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
- pkt + IP_H); /* packet memory header */
-
- if (type == ICMP_UNREACH) /* type = 3 */
+ pkt + LIBNET_IP_H); /* packet memory header */
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_ECHO_H + payload_s);
+ }
+ if (type == ICMP_UNREACH) { /* type = 3 */
libnet_build_icmp_unreach(type, /* ICMP type */
code, /* ICMP code */
0, /* ICMP original length */
@@ -233,9 +263,10 @@ buildicmp()
source, /* source address */
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
- pkt + IP_H); /* packet memory header */
-
- if (type == ICMP_REDIRECT) /* type = 5 */
+ pkt + LIBNET_IP_H); /* packet memory header */
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_UNREACH_H + payload_s);
+ }
+ if (type == ICMP_REDIRECT) { /* type = 5 */
libnet_build_icmp_redirect(type, /* ICMP type */
code, /* ICMP code */
gwy, /* preferred gateway */
@@ -249,18 +280,21 @@ buildicmp()
source, /* source address */
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
- pkt + IP_H); /* packet header memory */
-
- if (type == ICMP_ECHO) /* type = 8 */
+ pkt + LIBNET_IP_H); /* packet header memory */
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_REDIRECT_H + payload_s);
+ }
+ if (type == ICMP_ECHO) { /* type = 8 */
libnet_build_icmp_echo(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
seq, /* sequence number */
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
- pkt + IP_H); /* packet header memory */
+ pkt + LIBNET_IP_H); /* packet header memory */
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_ECHO_H + payload_s);
- if (type == ICMP_TIMXCEED) /* type = 11 */
+ }
+ if (type == ICMP_TIMXCEED) { /* type = 11 */
libnet_build_icmp_timeexceed(type, /* ICMP type */
code, /* ICMP code */
0, /* ICMP orig length */
@@ -273,9 +307,10 @@ buildicmp()
source, /* source address */
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
- pkt + IP_H); /* packet header memory */
-
- if (type == ICMP_TSTAMP) /* type = 13 */
+ pkt + LIBNET_IP_H); /* packet header memory */
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_TIMXCEED_H + payload_s);
+ }
+ if (type == ICMP_TSTAMP) { /* type = 13 */
libnet_build_icmp_timestamp(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
@@ -285,9 +320,10 @@ buildicmp()
0, /* transmit timestamp */
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
- pkt + IP_H); /* packet header memory */
-
- if (type == ICMP_TSTAMPREPLY) /* type = 14 */
+ pkt + LIBNET_IP_H); /* packet header memory */
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_TS_H + payload_s);
+ }
+ if (type == ICMP_TSTAMPREPLY) { /* type = 14 */
libnet_build_icmp_timestamp(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
@@ -297,9 +333,10 @@ buildicmp()
ttime, /* transmit timestamp */
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
- pkt + IP_H); /* packet header memory */
-
- if (type == ICMP_MASKREQ) /* type = 17 */
+ pkt + LIBNET_IP_H); /* packet header memory */
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_TS_H + payload_s);
+ }
+ if (type == ICMP_MASKREQ) { /* type = 17 */
libnet_build_icmp_mask(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
@@ -307,9 +344,10 @@ buildicmp()
mask, /* address mask */
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
- pkt + IP_H); /* packet header memory */
-
- if (type == ICMP_MASKREPLY) /* type = 18 */
+ pkt + LIBNET_IP_H); /* packet header memory */
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_MASK_H + payload_s);
+ }
+ if (type == ICMP_MASKREPLY) { /* type = 18 */
libnet_build_icmp_mask(type, /* ICMP type */
0, /* ICMP code */
id, /* ICMP id */
@@ -317,10 +355,9 @@ buildicmp()
mask, /* address mask */
payload, /* ICMP payload pointer */
payload_s, /* ICMP payload size */
- pkt + IP_H); /* packet header memory */
-
- libnet_do_checksum(pkt, IPPROTO_ICMP, ICMP_H + IP_H + payload_s);
-
+ pkt + LIBNET_IP_H); /* packet header memory */
+ libnet_do_checksum(pkt, IPPROTO_ICMP, LIBNET_ICMP_MASK_H + payload_s);
+ }
memcpy(ipopt.ipopt_list, options, option_s);
*(ipopt.ipopt_list) = IPOPT_SECURITY;
*(ipopt.ipopt_list + 1) = 1;