--- libnet/src/libnet_checksum.c +++ libnet/src/libnet_checksum.c @@ -1,5 +1,5 @@ /* - * $Id: libnet_checksum.c,v 1.13 2004/03/01 20:26:12 mike Exp $ + * $Id: libnet_checksum.c,v 1.14 2004/11/09 07:05:07 mike Exp $ * * libnet * libnet_checksum.c - checksum routines @@ -38,10 +38,16 @@ #else #include "../include/win32/libnet.h" #endif + int libnet_in_cksum(u_int16_t *addr, int len) { int sum; + union + { + u_int16_t s; + u_int8_t b[2]; + }pad; sum = 0; @@ -50,9 +56,12 @@ sum += *addr++; len -= 2; } + if (len == 1) { - sum += *(u_int16_t *)addr; + pad.b[0] = *(u_int8_t *)addr; + pad.b[1] = 0; + sum += pad.s; } return (sum);