X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet_packet.c;h=b50ddc4f27f48114061674dadf2416dc4d90d888;hb=4c68a8cb60eb0a4c05d9ce98963b930a976b55ee;hp=df6f4826b64214558cd335ef1fc785f5f28e64d2;hpb=c845bc109c85e6fb350096c63e13ef8e617ee29b;p=tinc diff --git a/src/net_packet.c b/src/net_packet.c index df6f4826..b50ddc4f 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -515,7 +515,7 @@ static node_t *try_harder(const sockaddr_t *from, const vpn_packet_t *pkt) { for(node = node_tree->head; node; node = node->next) { n = node->data; - if(n == myself || !digest_active(&n->indigest)) + if(n == myself || !n->status.reachable || !digest_active(&n->indigest)) continue; if(try_mac(n, pkt)) { @@ -533,15 +533,18 @@ void handle_incoming_vpn_data(int sock, short events, void *data) { sockaddr_t from; socklen_t fromlen = sizeof from; node_t *n; + int len; - pkt.len = recvfrom(sock, (char *) &pkt.seqno, MAXSIZE, 0, &from.sa, &fromlen); + len = recvfrom(sock, (char *) &pkt.seqno, MAXSIZE, 0, &from.sa, &fromlen); - if(pkt.len < 0) { + if(len <= 0 || len > MAXSIZE) { if(!sockwouldblock(sockerrno)) logger(LOG_ERR, "Receiving packet failed: %s", sockstrerror(sockerrno)); return; } + pkt.len = len; + sockaddrunmap(&from); /* Some braindead IPv6 implementations do stupid things. */ n = lookup_node_udp(&from);