summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
8f2ef1a)
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.
#include "system.h"
#ifdef HAVE_ZLIB
#include "system.h"
#ifdef HAVE_ZLIB
#ifdef HAVE_ZLIB
else {
unsigned long destlen = MAXSIZE;
#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;