diff options
author | Vadim Kochan <vadim4j@gmail.com> | 2016-07-16 12:39:43 +0300 |
---|---|---|
committer | Tobias Klauser <tklauser@distanz.ch> | 2016-07-18 14:43:45 +0200 |
commit | 9ad5ccd66e89778e33cd1be3cd8887ec4a03d177 (patch) | |
tree | c4e804dd8f4f6795ca505ccd0b0ee69acf1dfe7c /trafgen_l3.c | |
parent | c11d67bf8ce5666b454ba34c004c264d5cfae24a (diff) |
trafgen: ipv4: Do not use user-provided 'ihl' field to calculate csum
It is potentially dangerous to use the user specified IHL field for
csum calculation, as it might lead to read buffer overflows.
Instead introduce and use the len field in struct proto_hdr which is
calculated automatically after the header is built.
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
[tk: reword commit message]
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Diffstat (limited to 'trafgen_l3.c')
-rw-r--r-- | trafgen_l3.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/trafgen_l3.c b/trafgen_l3.c index 012321f..ad58270 100644 --- a/trafgen_l3.c +++ b/trafgen_l3.c @@ -53,10 +53,8 @@ static void ipv4_packet_finish(struct proto_hdr *hdr) if (!proto_field_is_set(hdr, IP4_CSUM)) { uint16_t csum; - uint8_t ihl; - ihl = proto_field_get_u8(hdr, IP4_IHL); - csum = htons(calc_csum(&pkt->payload[hdr->pkt_offset], ihl * 4)); + csum = htons(calc_csum(&pkt->payload[hdr->pkt_offset], hdr->len)); proto_field_set_u16(hdr, IP4_CSUM, bswap_16(csum)); } } |