ID:               27383
 User updated by:  remijnj at eidetica dot com
 Reported By:      remijnj at eidetica dot com
 Status:           Open
 Bug Type:         HTTP related
 Operating System: Linux (Slackware 9.1)
 PHP Version:      4.3.5RC3
 New Comment:

Here the patch which fixes it. I hope i've done it in the right patch
format (diff -urN).





diff -urN php-4.3.5RC3/ext/standard/http_fopen_wrapper.c
php-4.3.5RC3-mine/ext/standard/http_fopen_wrapper.c

--- php-4.3.5RC3/ext/standard/http_fopen_wrapper.c      2003-11-28
19:51:14.000000000 +0100

+++ php-4.3.5RC3-mine/ext/standard/http_fopen_wrapper.c 2004-02-24
19:51:07.000000000 +0100

@@ -107,6 +107,7 @@

        size_t chunk_size = 0, file_size = 0;

        int eol_detect, have_header = 0;

 

+       tmp_line = '\0';

        if (redirect_max < 1) {

                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Circular redirect,
aborting.");

                return NULL;

@@ -345,11 +346,24 @@

                if (php_stream_gets(stream, tmp_line, sizeof(tmp_line)-1) !=
NULL)   {

                        zval *http_response;

                        int response_code;

+                       int tmp_line_len;

+

+                       tmp_line_len = strlen(tmp_line);

 

                        MAKE_STD_ZVAL(http_response);

                        ZVAL_NULL(http_response);

 

-                       response_code = atoi(tmp_line + 9);

+                       if (tmp_line_len > 9) {

+                               response_code = atoi(tmp_line + 9);

+                       } else {

+                               /* 

+                                * short http_response, if not caught like

+                                * this we'd pass uninitialized memory to

+                                * atoi (SEGV if there is no '\0' byte in

+                                * there)

+                                */

+                               response_code = 0;

+                       }

                        switch(response_code) {

                                case 200:

                                case 302:

@@ -365,7 +379,7 @@

                                                        tmp_line, response_code);

                        }

                        

-                       Z_STRLEN_P(http_response) = strlen(tmp_line);

+                       Z_STRLEN_P(http_response) = tmp_line_len;

                        Z_STRVAL_P(http_response) = estrndup(tmp_line,
Z_STRLEN_P(http_response));

                        if 
(Z_STRVAL_P(http_response)[Z_STRLEN_P(http_response)-1]=='\n')
{

                                
Z_STRVAL_P(http_response)[Z_STRLEN_P(http_response)-1]=0;


Previous Comments:
------------------------------------------------------------------------

[2004-02-24 14:13:53] remijnj at eidetica dot com

Description:
------------
I have seen uninitialized memory being printed out in my php eror log.
Some of the errors are like:



[24-Feb-2004 12:00:12] PHP Warning:  file_get_contents(<snip>) failed
to open stream: HTTP request

 failed!  ??B^P in /usr/local/www/include/file.inc on line 17



This happened when the apache server i connected to was too busy to
handle the request (load way too high).



In that specific case tmp_line will be used uninitialized. This code
could possibly lead to a SEGV (Segmentation Violation).



Looking at the code i also spotted another (more unlikely) bug which
could also result in a SEGV.



I have prepared a patch against 4.3.5RC5 which should solve this
problem (in my opinion). 



If anyone has any questions on this report or my patch (which i will
try to add later) please contact me.



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=27383&edit=1

Reply via email to