From: Guus Sliepen Date: Sun, 18 Feb 2018 14:38:12 +0000 (+0100) Subject: Reduce memory allocations due to zlib's uncompress(). X-Git-Tag: release-1.1pre16~24 X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=commitdiff_plain;h=6be453fc63da9f87455b5e579cb686f95fa92102;hp=8f2ef1a174d18a9efdf9b0bd2417132fe7d84e9f 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. --- diff --git a/src/net_packet.c b/src/net_packet.c index d37f2202..3d3d6913 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; }