You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by jm...@apache.org on 2008/12/29 12:23:19 UTC

svn commit: r729865 - /spamassassin/trunk/spamc/libspamc.c

Author: jm
Date: Mon Dec 29 03:23:18 2008
New Revision: 729865

URL: http://svn.apache.org/viewvc?rev=729865&view=rev
Log:
bug 6025: spamc client library leaks the zlib compression buffer if compression is used. fix by Nico Prenzel

Modified:
    spamassassin/trunk/spamc/libspamc.c

Modified: spamassassin/trunk/spamc/libspamc.c
URL: http://svn.apache.org/viewvc/spamassassin/trunk/spamc/libspamc.c?rev=729865&r1=729864&r2=729865&view=diff
==============================================================================
--- spamassassin/trunk/spamc/libspamc.c (original)
+++ spamassassin/trunk/spamc/libspamc.c Mon Dec 29 03:23:18 2008
@@ -623,6 +623,15 @@
     m->content_length = -1;
 }
 
+static void _free_zlib_buffer(unsigned char **zlib_buf, int *zlib_bufsiz)
+{
+	if(*zlib_buf) {
+	free(*zlib_buf);
+	*zlib_buf=NULL;
+	}
+	*zlib_bufsiz=0;
+}
+
 static void _use_msg_for_out(struct message *m)
 {
     if (m->outbuf)
@@ -1244,6 +1253,7 @@
     if (zlib_on) {
         if (_zlib_compress(m->msg, m->msg_len, &zlib_buf, &zlib_bufsiz, flags) != EX_OK)
         {
+            _free_zlib_buffer(&zlib_buf, &zlib_bufsiz);
             return EX_OSERR;
         }
         towrite_buf = zlib_buf;
@@ -1254,6 +1264,9 @@
       if (username != NULL) {
 	if (strlen(username) + 8 >= (bufsiz - len)) {
           _use_msg_for_out(m);
+	   if (zlib_on) {
+          _free_zlib_buffer(&zlib_buf, &zlib_bufsiz);
+	   }
           return EX_OSERR;
 	}
 	strcpy(buf + len, "User: ");
@@ -1266,6 +1279,9 @@
       }
       if ((m->msg_len > SPAMC_MAX_MESSAGE_LEN) || ((len + 27) >= (bufsiz - len))) {
 	_use_msg_for_out(m);
+	if (zlib_on) {
+	_free_zlib_buffer(&zlib_buf, &zlib_bufsiz);
+	}
 	return EX_DATAERR;
       }
       len += snprintf(buf + len, 8192-len, "Content-length: %d\r\n\r\n", (int) towrite_len);
@@ -1280,6 +1296,9 @@
 
     if (rc != EX_OK) {
 	_use_msg_for_out(m);
+	if (zlib_on) {
+	_free_zlib_buffer(&zlib_buf, &zlib_bufsiz);
+	}
 	return rc;      /* use the error code try_to_connect_*() gave us. */
     }
 
@@ -1304,6 +1323,13 @@
 	shutdown(sock, SHUT_WR);
     }
 
+    /* free zlib buffer
+    * bug 6025: zlib buffer not freed if compression is used
+    */
+    if (zlib_on) {
+    _free_zlib_buffer(&zlib_buf, &zlib_bufsiz);
+    }
+
     /* ok, now read and parse it.  SPAMD/1.2 line first... */
     failureval =
 	_spamc_read_full_line(m, flags, ssl, sock, buf, &len, bufsiz);