Attached. -Nigel
> > There is 2 buffer overrun possibilities which can cause assert()'s to be > > triggered, which takes down clamav-milter. > > > > I've sent patches through to Nigel Horne concerning this. > > I must have missed them. Please resend. > > - -Nigel >
diff -c --new-file --recursive clamav-0.60_vanilla/clamav-milter/clamav-milter.c
clamav-0.60_milterfixes/clamav-milter/clamav-milter.c
*** clamav-0.60_vanilla/clamav-milter/clamav-milter.c Tue May 30 01:17:00 2000
--- clamav-0.60_milterfixes/clamav-milter/clamav-milter.c Thu Jul 10 08:22:20
2003
***************
*** 925,933 ****
syslog(LOG_NOTICE, "clean message from %s", privdata->from);
} else {
char **to;
! char err[1024];
FILE *sendmail;
/*
* TODO: check that clamd didn't crash (WIFSIGNALED(status))
*/
--- 925,935 ----
syslog(LOG_NOTICE, "clean message from %s", privdata->from);
} else {
char **to;
! char *err;
FILE *sendmail;
+ int i;
+
/*
* TODO: check that clamd didn't crash (WIFSIGNALED(status))
*/
***************
*** 935,949 ****
syslog(LOG_NOTICE, mess);
snprintf(err, sizeof(err), "Intercepted virus from: %s to:",
privdata->from);
! ptr = strchr(err, '\0');
! /* TODO: check for buffer overrun in err[] */
! for(to = privdata->to; *to; to++) {
! ptr = strrcpy(ptr, " ");
ptr = strrcpy(ptr, *to);
}
- assert(strlen(err) < sizeof(err));
-
if(use_syslog)
syslog(LOG_NOTICE, err);
#ifdef CL_DEBUG
--- 937,963 ----
syslog(LOG_NOTICE, mess);
snprintf(err, sizeof(err), "Intercepted virus from: %s to:",
privdata->from);
!
! /*
! * Setup err as a list of recipients
! */
! i = 1024;
! err = (char *) malloc(i);
! ptr = err;
!
! for (to = privdata->to; *to; to++) {
! /*
! * Re-alloc if we run out of buffer space
! */
! if (ptr + 5 + strlen(*to) >= err + i) {
! i += 1024;
! realloc(err,i);
! }
! ptr = strrcpy(ptr, " ");
ptr = strrcpy(ptr, *to);
+ ptr = strrcpy(ptr, "\n");
}
if(use_syslog)
syslog(LOG_NOTICE, err);
#ifdef CL_DEBUG
***************
*** 978,983 ****
--- 992,998 ----
smfi_setreply(ctx, "550", "5.7.1", "Virus detected by ClamAV -
http://clamav.elektrapro.com");
rc = SMFIS_REJECT;
+ free(err);
}
clamfi_cleanup(ctx);
***************
*** 1117,1127 ****
va_list argp;
va_start(argp, format);
! vsprintf(output, format, argp);
va_end(argp);
len = strlen(output);
- assert(len <= sizeof(output));
ptr = output;
}
#ifdef CL_DEBUG
--- 1132,1141 ----
va_list argp;
va_start(argp, format);
! vsnprintf(output, BUFSIZ, format, argp);
va_end(argp);
len = strlen(output);
ptr = output;
}
#ifdef CL_DEBUG
pgp00000.pgp
Description: PGP signature
