ID:               26938
 User updated by:  runekl at opoint dot com
 Reported By:      runekl at opoint dot com
-Status:           Feedback
+Status:           Open
 Bug Type:         Program Execution
 Operating System: All
 PHP Version:      5CVS-2004-01-16 (dev)
 New Comment:

That's strange, because it is not hard to read the code and see what
goes wrong.

I use Linux Redhat 9 with all updates.  The compiler is gcc (GCC) 3.2.2
20030222 (Red Hat Linux 3.2.2-5).  Is the constant EXEC_INPUT_BUF 4096
in php.h at your place?  My configure is

'./configure' \
'--with-apxs2=/usr/local/apache2/bin/apxs' \
'--enable-track-vars' \
'--with-gd' \
'--enable-calendar' \
'--enable-inline-optimization' \
'--enable-safe-mode' \
'--enable-sysvsem' \
'--enable-sysvshm' \
'--with-zlib' \
'--with-mysql' \
'--with-lib-xml-dir=/usr/local/include/libxml2' \
'--with-xsl=/usr/local/include/libxslt' \
'--enable-wddx' \
'--with-gettext' \
'--with-png' \
'--with-jpeg' \
'--with-jpeg-6b' \
'--with-mm' \
'--without-sqlite' \
"$@"


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

[2004-01-18 18:38:27] [EMAIL PROTECTED]

What OS do you use? (I tested within Linux and solaris, and your test
script works fine _without_ your patch)


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

[2004-01-18 16:11:38] runekl at opoint dot com

I get the this when running the test I have suggested.

md5(line 0)= e86410fa2d6e2634fd8ac5f4b3afe7f3 (length 10)
md5(line 1)= e84debf3a1d132871d7fe45c1c04c566 (length 20000)
md5(line 2)= 2713d01e967adfd64c49857370ab420b (length 18191)
md5(line 3)= 2ecdde3959051d913f61b14579ea136d (length 5)
md5(line 4)= 2713d01e967adfd64c49857370ab420b (length 18191)
md5(line 5)= 902fbdd2b1df0c4f70b4a5d23525e932 (length 3)

Look at the lines 2 and 4.  The lines to read are 10000 characters
long, but PHP 'reads' 18191 bytes, e.g. 2*EXEC_INPUT_BUF-1 to much. 
The extra characters come from line 1.

With the patch in my first post I get correct output.

Since test 26615 does not test reading long lines good enough and is
about a bug in the same loop, I suggest replacing it.

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

[2004-01-18 10:19:13] [EMAIL PROTECTED]

That test passes for me with latest CVS..?
So what's the bug? :)


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

[2004-01-17 10:20:51] runekl at opoint dot com

I suggest you replace the test for bug 26615 with the one below.  That
should cover both cases.  It will also make your distribution smaller
-)

--TEST--
Bug #26615 (exec crash on long input lines)
--FILE--
<?php
$out = array();
$status = -1;
$php = getenv('TEST_PHP_EXECUTABLE');
exec($php . ' -r \'' 
     . '$lengths = array(10,20000,10000,5,10000,3);'
     . 'foreach($lengths as $length) {'
     . '  for($i=0;$i<$length;$i++) print chr(65+$i % 27);'
     . '  print "\n";'
     . '}\'', $out, $status);
for ($i=0;$i<6;$i++)
     print "md5(line $i)= " . md5($out[$i]) . " (length " .
strlen($out[$i]) . ")\n";
?>
--EXPECT--
md5(line 0)= e86410fa2d6e2634fd8ac5f4b3afe7f3 (length 10)
md5(line 1)= e84debf3a1d132871d7fe45c1c04c566 (length 20000)
md5(line 2)= c33b4d2f86908eea5d75ee5a61fd81f4 (length 10000)
md5(line 3)= 2ecdde3959051d913f61b14579ea136d (length 5)
md5(line 4)= c33b4d2f86908eea5d75ee5a61fd81f4 (length 10000)
md5(line 5)= 902fbdd2b1df0c4f70b4a5d23525e932 (length 3)

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

[2004-01-16 16:38:38] runekl at opoint dot com

Description:
------------
Exec fails to read two consecutive lines longer than 2*EXEC_INPUT_BUF
correctly.  While reading the first line, buflen is set to
3*EXEC_INPUT_BUF.  When reading part two of the second line, bufl will
be EXEC_INPUT_BUF to large since b!=buf.

Here is a patch:

Index: exec.c
===================================================================
RCS file: /repository/php-src/ext/standard/exec.c,v
retrieving revision 1.108
diff -C4 -r1.108 exec.c
*** exec.c      8 Jan 2004 08:17:31 -0000       1.108
--- exec.c      16 Jan 2004 21:35:35 -0000
***************
*** 111,132 ****

        if (type != 3) {
                b = buf;

!               while (php_stream_get_line(stream, b, EXEC_INPUT_BUF,
&bufl)) {
                        /* no new line found, let's read some more */
                        if (b[bufl - 1] != '\n' &&
!php_stream_eof(stream)) {
                                if (buflen < (bufl + (b - buf) +
EXEC_INPUT_BUF)) {
                                        bufl += b - buf;
!                                       buflen = bufl +
EXEC_INPUT_BUF;
                                        buf = erealloc(buf, buflen);
                                        b = buf + bufl;
                                } else {
                                        b += bufl;
                                }
                                continue;
                        } else if (b != buf) {
!                               bufl += buflen - EXEC_INPUT_BUF;
                        }

                        if (type == 1) {
                                PHPWRITE(buf, bufl);
--- 111,132 ----

        if (type != 3) {
                b = buf;

!               while (php_stream_get_line(stream, b, buflen - (b -
buf), &bufl)) {
                        /* no new line found, let's read some more */
                        if (b[bufl - 1] != '\n' &&
!php_stream_eof(stream)) {
                                if (buflen < (bufl + (b - buf) +
EXEC_INPUT_BUF)) {
                                        bufl += b - buf;
!                                       buflen = bufl + 1 +
EXEC_INPUT_BUF;
                                        buf = erealloc(buf, buflen);
                                        b = buf + bufl;
                                } else {
                                        b += bufl;
                                }
                                continue;
                        } else if (b != buf) {
!                               bufl += (b - buf);
                        }

                        if (type == 1) {
                                PHPWRITE(buf, bufl);




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


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

Reply via email to