Fix memory leak of zlib streams on CSTP reconnect
authorDavid Woodhouse <David.Woodhouse@intel.com>
Mon, 12 Dec 2011 15:24:29 +0000 (15:24 +0000)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Mon, 12 Dec 2011 15:24:29 +0000 (15:24 +0000)
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
cstp.c

diff --git a/cstp.c b/cstp.c
index cf11711..3cb2b56 100644 (file)
--- a/cstp.c
+++ b/cstp.c
@@ -394,11 +394,14 @@ int make_cstp_connection(struct openconnect_info *vpninfo)
                        if (!vpninfo->deflate_pkt) {
                                vpn_progress(vpninfo, PRG_ERR,
                                             _("Allocation of deflate buffer failed\n"));
+                               inflateEnd(&vpninfo->inflate_strm);
+                               deflateEnd(&vpninfo->deflate_strm);
                                vpninfo->deflate = 0;
+                       } else {
+                               memset(vpninfo->deflate_pkt, 0, sizeof(struct pkt));
+                               memcpy(vpninfo->deflate_pkt->hdr, data_hdr, 8);
+                               vpninfo->deflate_pkt->hdr[6] = AC_PKT_COMPRESSED;
                        }
-                       memset(vpninfo->deflate_pkt, 0, sizeof(struct pkt));
-                       memcpy(vpninfo->deflate_pkt->hdr, data_hdr, 8);
-                       vpninfo->deflate_pkt->hdr[6] = AC_PKT_COMPRESSED;
                }
        }
 
@@ -419,7 +422,10 @@ int cstp_reconnect(struct openconnect_info *vpninfo)
                queue_packet(&vpninfo->outgoing_queue, vpninfo->pending_deflated_pkt);
                vpninfo->pending_deflated_pkt = NULL;
        }
-
+       if (vpninfo->deflate) {
+               inflateEnd(&vpninfo->inflate_strm);
+               deflateEnd(&vpninfo->deflate_strm);
+       }
        timeout = vpninfo->reconnect_timeout;
        interval = vpninfo->reconnect_interval;