Message ID | 1570532051-923-1-git-send-email-alin.nastac@gmail.com |
---|---|
State | Accepted |
Delegated to: | Pablo Neira |
Headers | show |
Series | checksum: Fix TCP/UDP checksum computation on big endian arches | expand |
On Tue, Oct 08, 2019 at 12:54:11PM +0200, Alin Nastac wrote: > On big endian arches UDP/TCP checksum is incorrectly computed when > payload length is odd. Applied, thanks Alin.
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 <stdio.h> #include <stdbool.h> +#include <endian.h> #include <arpa/inet.h> #include <netinet/ip.h> #include <netinet/ip6.h> @@ -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);
On big endian arches UDP/TCP checksum is incorrectly computed when payload length is odd. Signed-off-by: Alin Nastac <alin.nastac@gmail.com> --- src/extra/checksum.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)