From 6be453fc63da9f87455b5e579cb686f95fa92102 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sun, 18 Feb 2018 15:38:12 +0100 Subject: [PATCH] Reduce memory allocations due to zlib's uncompress(). Everytime uncompress() is called, zlib allocates some buffer on the heap and frees it again. When compression is enabled, this is the biggest source of memory allocations in tinc. Instead of using this function, use inflate(), which can store its state in a z_stream variable, which avoids (re)allocating memory for every packet received. This issue was found thanks to heaptrack. --- src/net_packet.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/net_packet.c b/src/net_packet.c index d37f220..3d3d691 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -23,6 +23,7 @@ #include "system.h" #ifdef HAVE_ZLIB +#define ZLIB_CONST #include #endif @@ -249,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; } -- 2.25.1