--- mimedefang.h.orig Tue Nov 2 18:41:31 2004 +++ mimedefang.h Tue Nov 2 18:41:45 2004 @@ -13,7 +13,7 @@ #ifndef MIMEDEFANG_H #define MIMEDEFANG_H 1 -#define SMALLBUF 8192 +#define SMALLBUF 16384 #define BIGBUF 65536 #include --- mimedefang.c.orig Tue Jun 14 02:05:00 2005 +++ mimedefang.c Sun Aug 28 17:13:15 2005 @@ -247,15 +247,17 @@ char const *fname, int sample_fd) { - char buf[SMALLBUF]; + char *buf; if (sample_fd >= 0 && !ConserveDescriptors) return sample_fd; + buf = malloc(SMALLBUF); snprintf(buf, SMALLBUF, "%s/%s", data->dir, fname); sample_fd = open(buf, O_CREAT|O_APPEND|O_RDWR, 0640); if (sample_fd < 0) { syslog(LOG_WARNING, "%s: Could not open %s/%s: %m", data->qid, data->dir, fname); } + free(buf); return sample_fd; } @@ -523,7 +525,9 @@ data->lastWasCR = 0; if (doRelayCheck) { - char buf2[SMALLBUF]; + char *buf2; + + buf2 = malloc(SMALLBUF); int n = MXRelayOK(MultiplexorSocketName, buf2, data->hostip, data->hostname); if (n == MD_REJECT) { @@ -531,6 +535,7 @@ /* set_dsn(ctx, buf2, 5); */ /* We reject connections from this relay */ cleanup(ctx); + free(buf2); DEBUG_EXIT("mfconnect", __LINE__, "SMFIS_REJECT"); return SMFIS_REJECT; } @@ -538,6 +543,7 @@ /* Can't call smfi_setreply from connect callback */ /* set_dsn(ctx, buf2, 4); */ cleanup(ctx); + free(buf2); DEBUG_EXIT("mfconnect", __LINE__, "SMFIS_TEMPFAIL"); return SMFIS_TEMPFAIL; } @@ -545,15 +551,18 @@ /* Can't call smfi_setreply from connect callback */ /* set_dsn(ctx, buf2, 2); */ cleanup(ctx); + free(buf2); return SMFIS_ACCEPT; } if (n == MD_DISCARD) { /* Can't call smfi_setreply from connect callback */ /* set_dsn(ctx, buf2, 2); */ cleanup(ctx); + free(buf2); return SMFIS_DISCARD; } + free(buf2); } DEBUG_EXIT("mfconnect", __LINE__, "SMFIS_CONTINUE"); return SMFIS_CONTINUE; @@ -637,8 +646,8 @@ int tries; int i; int success; - char buffer[SMALLBUF]; - char buf2[SMALLBUF]; + char *buffer; + char *buf2; time_t now = time(NULL); unsigned long ulnow = (unsigned long) now; char *queueid; @@ -694,6 +703,8 @@ success = 0; + buffer = malloc(SMALLBUF); + /* Try making a directory whose name contains the Sendmail qid first */ if (data->qid && data->qid != NOQUEUE) { snprintf(buffer, SMALLBUF, "%s/mdefang-%s", SpoolDir, data->qid); @@ -708,6 +719,7 @@ syslog(LOG_INFO, "Could not lock MkdirMutex"); cleanup(ctx); DEBUG_EXIT("envfrom", __LINE__, "SMFIS_TEMPFAIL"); + free(buffer); return SMFIS_TEMPFAIL; } } @@ -738,6 +750,7 @@ data->qid, buffer); cleanup(ctx); DEBUG_EXIT("envfrom", __LINE__, "SMFIS_TEMPFAIL"); + free(buffer); return SMFIS_TEMPFAIL; } @@ -761,6 +774,7 @@ rmdir(buffer); cleanup(ctx); DEBUG_EXIT("envfrom", __LINE__, "SMFIS_TEMPFAIL"); + free(buffer); return SMFIS_TEMPFAIL; } @@ -776,8 +790,10 @@ if (data->cmdFD < 0) { cleanup(ctx); DEBUG_EXIT("envfrom", __LINE__, "SMFIS_TEMPFAIL"); + free(buffer); return SMFIS_TEMPFAIL; } + free(buffer); /* Write the sender */ write_mx_command(data->cmdFD, 'S', (unsigned char *) from[0]); @@ -822,6 +838,7 @@ data->myip = MyIPAddress; } + buf2 = malloc(SMALLBUF); if (doSenderCheck) { int n = MXSenderOK(MultiplexorSocketName, buf2, @@ -833,6 +850,7 @@ /* We reject connections from this sender */ cleanup(ctx); DEBUG_EXIT("envfrom", __LINE__, "SMFIS_REJECT"); + free(buf2); return SMFIS_REJECT; } if (n <= MD_TEMPFAIL) { @@ -840,16 +858,19 @@ cleanup(ctx); DEBUG_EXIT("envfrom", __LINE__, "SMFIS_TEMPFAIL"); + free(buf2); return SMFIS_TEMPFAIL; } if (n == MD_ACCEPT_AND_NO_MORE_FILTERING) { set_dsn(ctx, buf2, 2); cleanup(ctx); + free(buf2); return SMFIS_ACCEPT; } if (n == MD_DISCARD) { set_dsn(ctx, buf2, 2); cleanup(ctx); + free(buf2); return SMFIS_DISCARD; } if (n == MD_CONTINUE) { @@ -873,6 +894,7 @@ data->cmdFD = put_fd(data->cmdFD); DEBUG_EXIT("envfrom", __LINE__, "SMFIS_CONTINUE"); + free(buf2); return SMFIS_CONTINUE; } @@ -890,11 +912,12 @@ rcptto(SMFICTX *ctx, char **to) { struct privdata *data = DATA; - char ans[SMALLBUF]; + char *ans; sfsistat retcode = SMFIS_CONTINUE; char const *rcpt_mailer, *rcpt_host, *rcpt_addr; int i; + ans = NULL; DEBUG_ENTER("rcptto", __LINE__); if (!data) { syslog(LOG_WARNING, "rcptto: Unable to obtain private data from milter context"); @@ -922,6 +945,7 @@ return SMFIS_TEMPFAIL; } } + ans = malloc(SMALLBUF); n = MXRecipientOK(MultiplexorSocketName, ans, (char const **) to, data->sender, data->hostip, data->hostname, data->firstRecip, data->heloArg, @@ -932,23 +956,27 @@ set_dsn(ctx, ans, 5); DEBUG_EXIT("rcptto", __LINE__, "SMFIS_REJECT"); + free(ans); return SMFIS_REJECT; } if (n <= MD_TEMPFAIL) { set_dsn(ctx, ans, 4); DEBUG_EXIT("rcptto", __LINE__, "SMFIS_TEMPFAIL"); + free(ans); return SMFIS_TEMPFAIL; } if (n == MD_ACCEPT_AND_NO_MORE_FILTERING) { set_dsn(ctx, ans, 2); cleanup(ctx); + free(ans); return SMFIS_ACCEPT; } if (n == MD_DISCARD) { set_dsn(ctx, ans, 2); cleanup(ctx); + free(ans); return SMFIS_DISCARD; } if (n == MD_CONTINUE) { @@ -962,6 +990,7 @@ if (data->cmdFD < 0) { cleanup(ctx); DEBUG_EXIT("rcptto", __LINE__, "SMFIS_TEMPFAIL"); + free(ans); return SMFIS_TEMPFAIL; } writestr(data->cmdFD, "R"); @@ -981,6 +1010,7 @@ data->cmdFD = put_fd(data->cmdFD); DEBUG_EXIT("rcptto", __LINE__, "SMFIS_CONTINUE or SMFIS_ACCEPT"); + free(ans); return retcode; } @@ -1249,8 +1279,7 @@ static sfsistat eom(SMFICTX *ctx) { - char buffer[SMALLBUF]; - char result[SMALLBUF]; + char *buffer; char *rbuf, *rptr, *eptr; int seen_F = 0; @@ -1319,6 +1348,7 @@ } /* Read the results file */ + buffer = malloc(SMALLBUF); snprintf(buffer, SMALLBUF, "%s/RESULTS", data->dir); res_fd = open(buffer, O_RDONLY); if (res_fd < 0) { @@ -1326,6 +1356,7 @@ data->filterFailed = 1; cleanup(ctx); DEBUG_EXIT("eom", __LINE__, "SMFIS_TEMPFAIL"); + free(buffer); return SMFIS_TEMPFAIL; } @@ -1336,6 +1367,7 @@ cleanup(ctx); data->filterFailed = 1; DEBUG_EXIT("eom", __LINE__, "SMFIS_TEMPFAIL"); + free(buffer); return SMFIS_TEMPFAIL; } @@ -1347,6 +1379,7 @@ cleanup(ctx); data->filterFailed = 1; DEBUG_EXIT("eom", __LINE__, "SMFIS_TEMPFAIL"); + free(buffer); return SMFIS_TEMPFAIL; } @@ -1354,17 +1387,14 @@ /* SMALLBUF-sized buffer. However, we'll allocate up to BIGBUF bytes */ /* for weird, large RESULTS files. */ - if (statbuf.st_size < SMALLBUF) { - rbuf = result; - } else { - rbuf = malloc(statbuf.st_size + 1); - if (!rbuf) { - syslog(LOG_WARNING, "%s: Unable to allocate memory for RESULTS data", data->qid); - closefd(res_fd); - cleanup(ctx); - DEBUG_EXIT("eom", __LINE__, "SMFIS_TEMPFAIL"); - return SMFIS_TEMPFAIL; - } + rbuf = malloc(statbuf.st_size + 1); + if (!rbuf) { + syslog(LOG_WARNING, "%s: Unable to allocate memory for RESULTS data", data->qid); + closefd(res_fd); + cleanup(ctx); + DEBUG_EXIT("eom", __LINE__, "SMFIS_TEMPFAIL"); + free(buffer); + return SMFIS_TEMPFAIL; } /* Slurp in the file */ @@ -1372,7 +1402,8 @@ if (n < 0) { syslog(LOG_WARNING, "%s: Error reading RESULTS file: %m", data->qid); closefd(res_fd); - if (rbuf != result) free(rbuf); + free(rbuf); + free(buffer); cleanup(ctx); DEBUG_EXIT("eom", __LINE__, "SMFIS_TEMPFAIL"); return SMFIS_TEMPFAIL; @@ -1589,7 +1620,8 @@ r = cleanup(ctx); bail_out: - if (rbuf != result) free(rbuf); + free(rbuf); + free(buffer); if (LogTimes) { long sec_diff, usec_diff;