From bd7b0115c11870d3a97b8c0ed25498b6eed2aa8f Mon Sep 17 00:00:00 2001 From: Alin Nastac Date: Tue, 8 Oct 2019 12:54:11 +0200 Subject: checksum: Fix TCP/UDP checksum computation on big endian arches On big endian arches UDP/TCP checksum is incorrectly computed when payload length is odd. Signed-off-by: Alin Nastac Signed-off-by: Pablo Neira Ayuso --- src/extra/checksum.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/extra/checksum.c b/src/extra/checksum.c index 4d52a99..42389aa 100644 --- a/src/extra/checksum.c +++ b/src/extra/checksum.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -26,8 +27,13 @@ uint16_t nfq_checksum(uint32_t sum, uint16_t *buf, int size) sum += *buf++; size -= sizeof(uint16_t); } - if (size) - sum += *(uint8_t *)buf; + if (size) { +#if __BYTE_ORDER == __BIG_ENDIAN + sum += (uint16_t)*(uint8_t *)buf << 8; +#else + sum += (uint16_t)*(uint8_t *)buf; +#endif + } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >>16); -- cgit v1.2.3