wez             Fri Feb 21 21:43:59 2003 EDT

  Added files:                 (Branch: PHP_4_3)
    /php4/ext/standard/tests/file       bug22362.phpt 

  Modified files:              
    /php4/ext/standard  file.c 
    /php4/ext/standard/tests/file       bug21131.phpt 
    /php4/main  php_streams.h streams.c 
  Log:
  Miscellaneous streams fixes, including probable fixes for:
  Bug #21131 (fopen with 'a+' and rewind() doesn't work)
  Bug #21713 (include remote files leaks temporary files + descriptors on Solaris)
  Bug #21185 (move_uploaded_file() does not ignore open_basedir as it should)
  Bug #22362 (combinations of fwrite(), fread() and fseek() produce unexpected results)
  
  
Index: php4/ext/standard/file.c
diff -u php4/ext/standard/file.c:1.279.2.9 php4/ext/standard/file.c:1.279.2.10
--- php4/ext/standard/file.c:1.279.2.9  Tue Feb 18 10:22:46 2003
+++ php4/ext/standard/file.c    Fri Feb 21 21:43:58 2003
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: file.c,v 1.279.2.9 2003/02/18 15:22:46 moriyoshi Exp $ */
+/* $Id: file.c,v 1.279.2.10 2003/02/22 02:43:58 wez Exp $ */
 
 /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
 
@@ -2038,7 +2038,7 @@
        int ret = FAILURE;
 
        srcstream = php_stream_open_wrapper(src, "rb", 
-                               ENFORCE_SAFE_MODE | REPORT_ERRORS,
+                               STREAM_DISABLE_OPEN_BASEDIR | REPORT_ERRORS,
                                NULL);
        
        if (!srcstream) 
Index: php4/ext/standard/tests/file/bug21131.phpt
diff -u php4/ext/standard/tests/file/bug21131.phpt:1.1.2.1 
php4/ext/standard/tests/file/bug21131.phpt:1.1.2.2
--- php4/ext/standard/tests/file/bug21131.phpt:1.1.2.1  Sun Dec 22 13:21:54 2002
+++ php4/ext/standard/tests/file/bug21131.phpt  Fri Feb 21 21:43:58 2003
@@ -9,15 +9,10 @@
 fclose($fp);
 
 $fp = fopen($filename, "a+");
-var_dump(ftell($fp));
 rewind($fp);
-var_dump(ftell($fp));
 fpassthru($fp);
 fclose($fp);
 unlink($filename);
 ?>
 --EXPECT--
-int(6)
-int(0)
 foobar
-
Index: php4/main/php_streams.h
diff -u php4/main/php_streams.h:1.61.2.6 php4/main/php_streams.h:1.61.2.7
--- php4/main/php_streams.h:1.61.2.6    Thu Jan  2 08:31:30 2003
+++ php4/main/php_streams.h     Fri Feb 21 21:43:58 2003
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_streams.h,v 1.61.2.6 2003/01/02 13:31:30 derick Exp $ */
+/* $Id: php_streams.h,v 1.61.2.7 2003/02/22 02:43:58 wez Exp $ */
 
 #ifndef PHP_STREAMS_H
 #define PHP_STREAMS_H
@@ -501,6 +501,11 @@
 
 /* this flag is only used by include/require functions */
 #define STREAM_OPEN_FOR_INCLUDE                128
+
+/* 512 skipped for PHP 5 compat */
+
+/* if set, skip open_basedir checks */
+#define STREAM_DISABLE_OPEN_BASEDIR    1024
 
 /* Antique - no longer has meaning */
 #define IGNORE_URL_WIN 0
Index: php4/main/streams.c
diff -u php4/main/streams.c:1.125.2.32 php4/main/streams.c:1.125.2.33
--- php4/main/streams.c:1.125.2.32      Wed Feb 19 03:12:25 2003
+++ php4/main/streams.c Fri Feb 21 21:43:58 2003
@@ -20,7 +20,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: streams.c,v 1.125.2.32 2003/02/19 08:12:25 moriyoshi Exp $ */
+/* $Id: streams.c,v 1.125.2.33 2003/02/22 02:43:58 wez Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -852,6 +852,15 @@
        if (buf == NULL || count == 0 || stream->ops->write == NULL)
                return 0;
 
+       /* if we have a seekable stream we need to ensure that data is written at the
+        * current stream->position. This means invalidating the read buffer and then
+        * performing a low-level seek */
+       if (stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0) {
+               stream->readpos = stream->writepos = 0;
+
+               stream->ops->seek(stream, stream->position, SEEK_SET, 
&stream->position TSRMLS_CC);
+       }
+       
        while (count > 0) {
                towrite = count;
                if (towrite > stream->chunk_size)
@@ -871,8 +880,6 @@
                         * buffered from fifos and sockets */
                        if (stream->ops->seek && (stream->flags & 
PHP_STREAM_FLAG_NO_SEEK) == 0) {
                                stream->position += justwrote;
-                               stream->writepos = 0;
-                               stream->readpos = 0;
                        }
                } else {
                        break;
@@ -907,10 +914,6 @@
 
 PHPAPI int _php_stream_seek(php_stream *stream, off_t offset, int whence TSRMLS_DC)
 {
-       /* not moving anywhere */
-       if ((offset == 0 && whence == SEEK_CUR) || (offset == stream->position && 
whence == SEEK_SET))
-               return 0;
-
        /* handle the case where we are in the buffer */
        if ((stream->flags & PHP_STREAM_FLAG_NO_BUFFER) == 0) {
                switch(whence) {
@@ -933,9 +936,6 @@
                                break;
                }
        }
-       
-       /* invalidate the buffer contents */
-       stream->readpos = stream->writepos = 0;
 
        if (stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0) {
                int ret;
@@ -954,6 +954,10 @@
                if (((stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0) || ret == 0) {
                        if (ret == 0)
                                stream->eof = 0;
+
+                       /* invalidate the buffer contents */
+                       stream->readpos = stream->writepos = 0;
+
                        return ret;
                }
                /* else the stream has decided that it can't support seeking after all;
@@ -1996,7 +2000,12 @@
                return FAILURE;
 #endif
 
-               if (flags & PHP_STREAM_CAST_TRY_HARD) {
+               if (!stream->filterhead && stream->ops->cast && 
stream->ops->cast(stream, castas, NULL TSRMLS_CC) == SUCCESS) {
+                       if (FAILURE == stream->ops->cast(stream, castas, ret 
TSRMLS_CC)) {
+                               return FAILURE;
+                       }
+                       goto exit_success;
+               } else if (flags & PHP_STREAM_CAST_TRY_HARD) {
                        php_stream *newstream;
 
                        newstream = php_stream_fopen_tmpfile();
@@ -2195,7 +2204,7 @@
                return php_stream_fopen_with_path_rel(path, mode, PG(include_path), 
opened_path, options);
        }
 
-       if (php_check_open_basedir(path TSRMLS_CC)) {
+       if ((options & STREAM_DISABLE_OPEN_BASEDIR == 0) && 
php_check_open_basedir(path TSRMLS_CC)) {
                return NULL;
        }
 

Index: php4/ext/standard/tests/file/bug22362.phpt
+++ php4/ext/standard/tests/file/bug22362.phpt



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to