From: Guus Sliepen Date: Sat, 29 Mar 2003 22:11:22 +0000 (+0000) Subject: Checksums must also work for uneven number of bytes. X-Git-Tag: release-1.0~96 X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=commitdiff_plain;h=8285827da127e38728b60b5c5484e5cdabff2f21;hp=c3ad3731a8dfa34535a156a7cfdb4e18afaa8bce;ds=sidebyside Checksums must also work for uneven number of bytes. --- diff --git a/src/route.c b/src/route.c index 53cf2d58..06dffc97 100644 --- a/src/route.c +++ b/src/route.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: route.c,v 1.1.2.48 2003/03/29 21:58:35 guus Exp $ + $Id: route.c,v 1.1.2.49 2003/03/29 22:11:22 guus Exp $ */ #include "config.h" @@ -76,10 +76,13 @@ uint16_t inet_checksum(void *data, int len, uint16_t prevsum) uint16_t *p = data; uint32_t checksum = prevsum ^ 0xFFFF; - len /= 2; - - while(len--) + while(len >= 2) { checksum += *p++; + len -= 2; + } + + if(len) + checksum += *(unsigned char *)p; while(checksum >> 16) checksum = (checksum & 0xFFFF) + (checksum >> 16);