X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Froute.c;h=d1048e76dc7c4890ad23c08a4e68048c6d7106a6;hb=50f23fbc02bd52bdc5cfd4fc9c0c6f177083efda;hp=461ba14a7cac9c80020e69309bbdcfb1ada2465a;hpb=10527e172ec4293faa8499fea136c14ffaed510a;p=tinc diff --git a/src/route.c b/src/route.c index 461ba14a..d1048e76 100644 --- a/src/route.c +++ b/src/route.c @@ -1,7 +1,7 @@ /* route.c -- routing Copyright (C) 2000-2005 Ivo Timmermans, - 2000-2013 Guus Sliepen + 2000-2018 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -59,33 +59,30 @@ static const size_t opt_size = sizeof(struct nd_opt_hdr); #define MAX(a, b) ((a) > (b) ? (a) : (b)) #endif -volatile int dummy; static timeout_t age_subnets_timeout; /* RFC 1071 */ -static uint16_t inet_checksum(void *data, int len, uint16_t prevsum) { - uint16_t *p = data; +static uint16_t inet_checksum(void *vdata, int len, uint16_t prevsum) { + uint8_t *data = vdata; + uint16_t word; uint32_t checksum = prevsum ^ 0xFFFF; while(len >= 2) { - checksum += *p++; + memcpy(&word, data, sizeof(word)); + checksum += word; + data += 2; len -= 2; } if(len) { - checksum += *(uint8_t *)p; + checksum += *data; } while(checksum >> 16) { checksum = (checksum & 0xFFFF) + (checksum >> 16); } - // Work around a compiler optimization bug. - if(checksum) { - dummy = 1; - } - return ~checksum; } @@ -165,7 +162,7 @@ static void route_ipv4_unreachable(node_t *source, vpn_packet_t *packet, length_ addr.sin_family = AF_INET; socklen_t addrlen = sizeof(addr); - if(!getsockname(sockfd, (struct sockaddr *) &addr, &addrlen) && addrlen <= sizeof(addr)) { + if(!getsockname(sockfd, (struct sockaddr *) &addr, &addrlen) && (size_t)addrlen <= sizeof(addr)) { ip_dst = addr.sin_addr; } } @@ -270,7 +267,7 @@ static void route_ipv6_unreachable(node_t *source, vpn_packet_t *packet, length_ addr.sin6_family = AF_INET6; socklen_t addrlen = sizeof(addr); - if(!getsockname(sockfd, (struct sockaddr *) &addr, &addrlen) && addrlen <= sizeof(addr)) { + if(!getsockname(sockfd, (struct sockaddr *) &addr, &addrlen) && (size_t)addrlen <= sizeof(addr)) { pseudo.ip6_src = addr.sin6_addr; } }