ID:               17547
 Updated by:       [EMAIL PROTECTED]
 Reported By:      [EMAIL PROTECTED]
-Status:           Critical
+Status:           Analyzed
-Bug Type:         Bzip2 Related
+Bug Type:         Filesystem function related
 Operating System: Linux (maybe Windows too)
 PHP Version:      4.0CVS-2002-05-31
 New Comment:

Actually it turned out to be a problem in main/streams.c . The fgets
emulation code isn't right. I basicall ripped the one from gzgets()
from zlib and it works:

Index: streams.c
===================================================================
RCS file: /repository/php4/main/streams.c,v
retrieving revision 1.52
diff -u -r1.52 streams.c
--- streams.c   30 Apr 2002 00:22:44 -0000      1.52
+++ streams.c   1 Jun 2002 00:46:43 -0000
@@ -248,21 +248,13 @@
                return NULL;
        } else {
                /* unbuffered fgets - poor performance ! */
-               size_t n = 1;
                char *c = buf;

                /* TODO: look at error returns? */

-               while(n < maxlen && stream->ops->read(stream, c, 1
TSRMLS_CC) > 0) {
-                       n++;
-                       if (*c == '\n') {
-                               c++;
-                               break;
-                       }
-                       c++;
-               }
-               *c = 0;
-               return buf;
+               while (--maxlen > 0 && stream->ops->read(stream, buf, 1
TSRMLS_CC) == 1 && *buf++ != '\n');
+               *buf = '\0';
+               return c == buf && maxlen > 0 ? NULL : c;
        }
 }

Does this sound reasonable, Wez?


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

[2002-05-31 17:36:59] [EMAIL PROTECTED]

Using a simple bzip2 compressed input file like

$ cat test.txt
1 ene
2 mene
3 muh
4 foo

and compressing it with bzip2

$ bzip2 -c test.txt >test.bz2

and then trying to use file() with compress.bzip2 wrapper results in an
infinite loop, i.e. never returned out of file():

$ cat test.php
<?
        print_r(file('compress.bzip2://test.bz2'));
?>

Looking at the code in file() using whil(1) { ... } seems dangerous for
race conditions. But it actually works with e.g. compress.zlib wrapper
and with normal files so I suspect this being a bug in the bz2 wrapper.

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


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

Reply via email to