X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet_packet.c;h=28459ce52aa5425638d04bed3ecb94ca2a72cb7c;hb=0fe69908838248c28624beb540257892db6bdcbd;hp=eb438b0878b325603a15e00d7369a39385e6dd09;hpb=df716df33af8e9a5b93d573a023ecd7fc24d9a03;p=tinc diff --git a/src/net_packet.c b/src/net_packet.c index eb438b08..28459ce5 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -53,6 +53,7 @@ #include "protocol.h" #include "route.h" #include "utils.h" +#include "random.h" /* The minimum size of a probe is 14 bytes, but since we normally use CBC mode encryption, we can add a few extra random bytes without increasing the @@ -962,7 +963,8 @@ bool send_sptps_data(node_t *to, node_t *from, int type, const void *data, size_ if(type == SPTPS_HANDSHAKE || tcponly || (!direct && !relay_supported) || (type != PKT_PROBE && origlen > relay->minmtu)) { if(type != SPTPS_HANDSHAKE && (to->nexthop->connection->options >> 24) >= 7) { - uint8_t buf[len + sizeof(to->id) + sizeof(from->id)]; + const size_t buflen = len + sizeof(to->id) + sizeof(from->id); + uint8_t *buf = alloca(buflen); uint8_t *buf_ptr = buf; memcpy(buf_ptr, &to->id, sizeof(to->id)); buf_ptr += sizeof(to->id); @@ -970,10 +972,10 @@ bool send_sptps_data(node_t *to, node_t *from, int type, const void *data, size_ buf_ptr += sizeof(from->id); memcpy(buf_ptr, data, len); logger(DEBUG_TRAFFIC, LOG_INFO, "Sending packet from %s (%s) to %s (%s) via %s (%s) (TCP)", from->name, from->hostname, to->name, to->hostname, to->nexthop->name, to->nexthop->hostname); - return send_sptps_tcppacket(to->nexthop->connection, buf, sizeof(buf)); + return send_sptps_tcppacket(to->nexthop->connection, buf, buflen); } - char buf[B64_SIZE(len)]; + char *buf = alloca(B64_SIZE(len)); b64encode_tinc(data, buf, len); /* If this is a handshake packet, use ANS_KEY instead of REQ_KEY, for two reasons: @@ -993,7 +995,7 @@ bool send_sptps_data(node_t *to, node_t *from, int type, const void *data, size_ overhead += sizeof(to->id) + sizeof(from->id); } - char buf[len + overhead]; + char *buf = alloca(len + overhead); char *buf_ptr = buf; if(relay_supported) { @@ -1170,6 +1172,7 @@ static void send_udp_probe_packet(node_t *n, size_t len) { len = sizeof(packet.data); } + len = MAX(len, MIN_PROBE_SIZE); packet.offset = DEFAULT_PACKET_OFFSET; memset(DATA(&packet), 0, 14); randomize(DATA(&packet) + 14, len - 14); @@ -1255,7 +1258,7 @@ static length_t choose_initial_maxmtu(node_t *n) { if(connect(sock, &sa->sa, SALEN(sa->sa))) { logger(DEBUG_TRAFFIC, LOG_ERR, "Connecting MTU assessment socket for %s (%s) failed: %s", n->name, n->hostname, sockstrerror(sockerrno)); - close(sock); + closesocket(sock); return MTU; } @@ -1264,11 +1267,11 @@ static length_t choose_initial_maxmtu(node_t *n) { if(getsockopt(sock, IPPROTO_IP, IP_MTU, (void *)&ip_mtu, &ip_mtu_len)) { logger(DEBUG_TRAFFIC, LOG_ERR, "getsockopt(IP_MTU) on %s (%s) failed: %s", n->name, n->hostname, sockstrerror(sockerrno)); - close(sock); + closesocket(sock); return MTU; } - close(sock); + closesocket(sock); if(ip_mtu < MINMTU) { logger(DEBUG_TRAFFIC, LOG_ERR, "getsockopt(IP_MTU) on %s (%s) returned absurdly small value: %d", n->name, n->hostname, ip_mtu); @@ -1904,7 +1907,7 @@ void handle_device_data(void *data, int flags) { myself->in_bytes += packet.len; route(myself, &packet); } else { - usleep(errors * 50000); + sleep_millis(errors * 50); errors++; if(errors > 10) {