Reduce memory allocations due to zlib's uncompress().
[tinc] / src / net_packet.c
index 9c913ca..3d3d691 100644 (file)
@@ -23,6 +23,7 @@
 #include "system.h"
 
 #ifdef HAVE_ZLIB
+#define ZLIB_CONST
 #include <zlib.h>
 #endif
 
@@ -158,8 +159,11 @@ static void udp_probe_h(node_t *n, vpn_packet_t *packet, length_t len) {
        if(!n->status.udp_confirmed) {
                n->status.udp_confirmed = true;
                fprintf(stderr, "Updating address cache...\n");
-               if (!n->address_cache)
+
+               if(!n->address_cache) {
                        n->address_cache = open_address_cache(n);
+               }
+
                reset_address_cache(n->address_cache, &n->address);
        }
 
@@ -246,9 +250,22 @@ static length_t uncompress_packet(uint8_t *dest, const uint8_t *source, length_t
 #ifdef HAVE_ZLIB
        else {
                unsigned long destlen = MAXSIZE;
+               static z_stream stream;
 
-               if(uncompress(dest, &destlen, source, len) == Z_OK) {
-                       return destlen;
+               if(stream.next_in) {
+                       inflateReset(&stream);
+               } else {
+                       inflateInit(&stream);
+               }
+
+               stream.next_in = source;
+               stream.avail_in = len;
+               stream.next_out = dest;
+               stream.avail_out = destlen;
+               stream.total_out = 0;
+
+               if(inflate(&stream, Z_FINISH) == Z_STREAM_END) {
+                       return stream.total_out;
                } else {
                        return -1;
                }
@@ -878,7 +895,7 @@ bool send_sptps_data(node_t *to, node_t *from, int type, const void *data, size_
        if(relay_supported) {
                if(direct) {
                        /* Inform the recipient that this packet was sent directly. */
-                       node_id_t nullid = {};
+                       node_id_t nullid = {{0}};
                        memcpy(buf_ptr, &nullid, sizeof(nullid));
                        buf_ptr += sizeof(nullid);
                } else {
@@ -1579,7 +1596,7 @@ static node_t *try_harder(const sockaddr_t *from, const vpn_packet_t *pkt) {
 
 static void handle_incoming_vpn_packet(listen_socket_t *ls, vpn_packet_t *pkt, sockaddr_t *addr) {
        char *hostname;
-       node_id_t nullid = {};
+       node_id_t nullid = {{0}};
        node_t *from, *to;
        bool direct = false;