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);