Hi, I hope someone can properly test this patch, I'm currently too short on time for it (and with properly testing I really mean it that way, not just by calling mail() ....)
- Markus On Sat, Jun 22, 2002 at 03:29:30PM +0200, Marcus Börger wrote : > Here comes the diff - but again i cannot compile it under windows and > therefore > i never compiled it :-( > If uses spprintf instead of s/n)printf where appropriate and uses a buffer > on stack for > chunked data instead of a static buffer. > > marcus > > cvs -z3 -q diff -w win32\sendmail.c (in directory S:\php4\) > Index: win32/sendmail.c > =================================================================== > RCS file: /repository/php4/win32/sendmail.c,v > retrieving revision 1.44 > diff -u -w -r1.44 sendmail.c > --- win32/sendmail.c 14 Jun 2002 05:42:08 -0000 1.44 > +++ win32/sendmail.c 22 Jun 2002 13:25:18 -0000 > @@ -63,7 +63,6 @@ > } > > #ifndef THREAD_SAFE > -char Buffer[MAIL_BUFFER_SIZE]; > > /* socket related data */ > SOCKET sc; > @@ -341,6 +340,7 @@ > // Author/Date: jcar 20/9/96 > // History: > //*******************************************************************/ > +#define CHUNK_BUFFER_SIZE 1024 > int SendText(char *RPath, char *Subject, char *mailTo, char *data, char > *headers, char *headers_lc, char **error_message) > { > int res, i; > @@ -348,6 +348,8 @@ > char *tempMailTo, *token, *pos1, *pos2; > char *server_response = NULL; > char *stripped_header = NULL; > + char *Buffer; > + char ChunkBuffer[CHUNK_BUFFER_SIZE+1]; > > /* check for NULL parameters */ > if (data == NULL) > @@ -366,23 +368,33 @@ > return (BAD_MSG_DESTINATION); > */ > > - sprintf(Buffer, "HELO %s\r\n", LocalHost); > + spprintf(&Buffer, 0, "HELO %s\r\n", LocalHost); > + if (!Buffer) > + return OUT_OF_MEMORY; > > /* in the beggining of the dialog */ > /* attempt reconnect if the first Post fail */ > if ((res = Post(Buffer)) != SUCCESS) { > MailConnect(); > - if ((res = Post(Buffer)) != SUCCESS) > + if ((res = Post(Buffer)) != SUCCESS) { > + efree(Buffer); > return (res); > } > + } > + efree(Buffer); > if ((res = Ack(&server_response)) != SUCCESS) { > SMTP_ERROR_RESPONSE(server_response); > return (res); > } > > - snprintf(Buffer, MAIL_BUFFER_SIZE, "MAIL FROM:<%s>\r\n", RPath); > - if ((res = Post(Buffer)) != SUCCESS) > + spprintf(&Buffer, 0, "MAIL FROM:<%s>\r\n", RPath); > + if (!Buffer) > + return OUT_OF_MEMORY; > + if ((res = Post(Buffer)) != SUCCESS) { > + efree(Buffer); > return (res); > + } > + efree(Buffer); > if ((res = Ack(&server_response)) != SUCCESS) { > SMTP_ERROR_RESPONSE(server_response); > return W32_SM_SENDMAIL_FROM_MALFORMED; > @@ -394,11 +406,15 @@ > token = strtok(tempMailTo, ","); > while(token != NULL) > { > - snprintf(Buffer, MAIL_BUFFER_SIZE, "RCPT TO:<%s>\r\n", > token); > + spprintf(&Buffer, 0, "RCPT TO:<%s>\r\n", token); > + if (!Buffer) > + return OUT_OF_MEMORY; > if ((res = Post(Buffer)) != SUCCESS) { > > efree(tempMailTo); > + efree(Buffer); > return (res); > > } > + efree(Buffer); > if ((res = Ack(&server_response)) != SUCCESS) { > SMTP_ERROR_RESPONSE(server_response); > > efree(tempMailTo); > @@ -426,9 +442,14 @@ > token = strtok(tempMailTo, ","); > while(token != NULL) > { > - sprintf(Buffer, "RCPT TO:<%s>\r\n", token); > - if ((res = Post(Buffer)) != SUCCESS) > + spprintf(&Buffer, 0, "RCPT TO:<%s>\r\n", token); > + if (!Buffer) > + return OUT_OF_MEMORY; > + if ((res = Post(Buffer)) != SUCCESS) { > + efree(Buffer); > return (res); > + } > + efree(Buffer); > if ((res = Ack(&server_response)) != SUCCESS) { > SMTP_ERROR_RESPONSE(server_response); > return (res); > @@ -460,10 +481,14 @@ > token = strtok(tempMailTo, ","); > while(token != NULL) > { > - sprintf(Buffer, "RCPT TO:<%s>\r\n", token); > + spprintf(&Buffer, 0, "RCPT TO:<%s>\r\n", > token); > + if (!Buffer) > + return OUT_OF_MEMORY; > if ((res = Post(Buffer)) != SUCCESS) { > + efree(Buffer); > return (res); > } > + efree(Buffer); > if ((res = Ack(&server_response)) != > SUCCESS) { > SMTP_ERROR_RESPONSE(server_response); > return (res); > @@ -525,7 +550,7 @@ > > > /* send message contents in 1024 chunks */ > - if (strlen(data) <= 1024) { > + if (strlen(data) <= CHUNK_BUFFER_SIZE) { > if ((res = Post(data)) != SUCCESS) > return (res); > } else { > @@ -533,18 +558,18 @@ > while (1) { > if (*p == '\0') > break; > - if (strlen(p) >= 1024) > - i = 1024; > + if (strlen(p) >= CHUNK_BUFFER_SIZE) > + i = CHUNK_BUFFER_SIZE; > else > i = strlen(p); > > /* put next chunk in buffer */ > - strncpy(Buffer, p, i); > - Buffer[i] = '\0'; > + strncpy(ChunkBuffer, p, i); > + ChunkBuffer[i] = '\0'; > p += i; > > /* send chunk */ > - if ((res = Post(Buffer)) != SUCCESS) > + if ((res = Post(ChunkBuffer)) != SUCCESS) > return (res); > } > } > > > At 11:35 11.06.2002, you wrote: > >Why not using spprintf which does not require to allocate the buffer before > >calling the function? > > > >marcus > > > >At 00:10 03.06.2002, Markus Fischer wrote: > >>mfischer Sun Jun 2 18:10:25 2002 EDT > >> > >> Modified files: > >> /php4/win32 sendmail.c > >> Log: > >> - Try to fix most of the buffer overflows and dynamically allocate > >>memory where > >> applicable. > >> > >> > >>Index: php4/win32/sendmail.c > >>diff -u php4/win32/sendmail.c:1.35 php4/win32/sendmail.c:1.36 > >>--- php4/win32/sendmail.c:1.35 Sun Jun 2 13:13:48 2002 > >>+++ php4/win32/sendmail.c Sun Jun 2 18:10:25 2002 > >>@@ -17,7 +17,7 @@ > >> * > >> */ > >> > >>-/* $Id: sendmail.c,v 1.35 2002/06/02 17:13:48 mfischer Exp $ */ > >>+/* $Id: sendmail.c,v 1.36 2002/06/02 22:10:25 mfischer Exp $ */ > (...) -- GnuPG Key: http://guru.josefine.at/~mfischer/C2272BD0.asc Did I help you? http://guru.josefine.at/wish_en Konnte ich helfen? http://guru.josefine.at/wish_de "uhmm.. the dates in the bug db.. aren't they printed a bit wrong, i mean, did i miss when we changed to 53 days/month ( +2002-02-53) ? =P - N0v3ll -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php