tony2001 Sat Apr 22 23:49:39 2006 UTC Modified files: /php-src/ext/standard/tests/file bug37158.phpt /php-src/main/streams php_streams_int.h streams.c userspace.c Log: merge fix for #37158 into HEAD add test
http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/file/bug37158.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/standard/tests/file/bug37158.phpt diff -u /dev/null php-src/ext/standard/tests/file/bug37158.phpt:1.2 --- /dev/null Sat Apr 22 23:49:39 2006 +++ php-src/ext/standard/tests/file/bug37158.phpt Sat Apr 22 23:49:39 2006 @@ -0,0 +1,43 @@ +--TEST-- +Bug #37158 (if userspace stream is present, fread() reads in 8192 max, otherwise it works) +--FILE-- +<?php + +class VariableStream { + + function stream_open($path, $mode, $options, &$opened_path) + { + return true; + } +} + +stream_wrapper_register("var", "VariableStream"); + +error_reporting(E_ALL | E_STRICT); +$file = dirname(__FILE__) . '/footest.txt'; +$x = str_repeat(1, 8192); +$fp = fopen($file, 'w'); +for ($i = 0; $i < 5; $i++) { + fwrite($fp, $x); +} +fclose($fp); + +$fp = fopen($file, 'r'); +$outsidecontents = fread($fp, 20000); +fclose($fp); +var_dump('size of contents 1 = ' . strlen($outsidecontents)); +$outsidecontents = file_get_contents($file); +var_dump('size of contents 2 = ' . strlen($outsidecontents)); + +unlink($file); + +echo "Done\n"; +?> +--EXPECT-- +string(26) "size of contents 1 = 20000" +string(26) "size of contents 2 = 40960" +Done +--UEXPECT-- +unicode(26) "size of contents 1 = 20000" +unicode(26) "size of contents 2 = 40960" +Done http://cvs.php.net/viewcvs.cgi/php-src/main/streams/php_streams_int.h?r1=1.8&r2=1.9&diff_format=u Index: php-src/main/streams/php_streams_int.h diff -u php-src/main/streams/php_streams_int.h:1.8 php-src/main/streams/php_streams_int.h:1.9 --- php-src/main/streams/php_streams_int.h:1.8 Sun Jan 1 13:09:57 2006 +++ php-src/main/streams/php_streams_int.h Sat Apr 22 23:49:39 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_streams_int.h,v 1.8 2006/01/01 13:09:57 sniper Exp $ */ +/* $Id: php_streams_int.h,v 1.9 2006/04/22 23:49:39 tony2001 Exp $ */ #if ZEND_DEBUG @@ -46,7 +46,6 @@ #define STREAM_DEBUG 0 #define STREAM_WRAPPER_PLAIN_FILES ((php_stream_wrapper*)-1) -extern php_stream_wrapper php_plain_files_wrapper; #ifndef MAP_FAILED #define MAP_FAILED ((void *) -1) http://cvs.php.net/viewcvs.cgi/php-src/main/streams/streams.c?r1=1.122&r2=1.123&diff_format=u Index: php-src/main/streams/streams.c diff -u php-src/main/streams/streams.c:1.122 php-src/main/streams/streams.c:1.123 --- php-src/main/streams/streams.c:1.122 Thu Apr 20 17:52:01 2006 +++ php-src/main/streams/streams.c Sat Apr 22 23:49:39 2006 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streams.c,v 1.122 2006/04/20 17:52:01 mike Exp $ */ +/* $Id: streams.c,v 1.123 2006/04/22 23:49:39 tony2001 Exp $ */ #define _GNU_SOURCE #include "php.h" @@ -1919,7 +1919,7 @@ return FAILURE; } - return zend_hash_add(&url_stream_wrappers_hash, protocol, protocol_len, wrapper, sizeof(*wrapper), NULL); + return zend_hash_add(&url_stream_wrappers_hash, protocol, protocol_len, &wrapper, sizeof(wrapper), NULL); } PHPAPI int php_unregister_url_stream_wrapper(char *protocol TSRMLS_DC) @@ -1927,6 +1927,15 @@ return zend_hash_del(&url_stream_wrappers_hash, protocol, strlen(protocol)); } +static void clone_wrapper_hash(TSRMLS_D) +{ + php_stream_wrapper *tmp; + + ALLOC_HASHTABLE(FG(stream_wrappers)); + zend_hash_init(FG(stream_wrappers), 0, NULL, NULL, 1); + zend_hash_copy(FG(stream_wrappers), &url_stream_wrappers_hash, NULL, &tmp, sizeof(tmp)); +} + /* API for registering VOLATILE wrappers */ PHPAPI int php_register_url_stream_wrapper_volatile(char *protocol, php_stream_wrapper *wrapper TSRMLS_DC) { @@ -1937,24 +1946,16 @@ } if (!FG(stream_wrappers)) { - php_stream_wrapper tmpwrapper; - - ALLOC_HASHTABLE(FG(stream_wrappers)); - zend_hash_init(FG(stream_wrappers), 0, NULL, NULL, 1); - zend_hash_copy(FG(stream_wrappers), &url_stream_wrappers_hash, NULL, &tmpwrapper, sizeof(php_stream_wrapper)); + clone_wrapper_hash(TSRMLS_C); } - return zend_hash_add(FG(stream_wrappers), protocol, protocol_len, wrapper, sizeof(*wrapper), NULL); + return zend_hash_add(FG(stream_wrappers), protocol, protocol_len, &wrapper, sizeof(wrapper), NULL); } PHPAPI int php_unregister_url_stream_wrapper_volatile(char *protocol TSRMLS_DC) { if (!FG(stream_wrappers)) { - php_stream_wrapper tmpwrapper; - - ALLOC_HASHTABLE(FG(stream_wrappers)); - zend_hash_init(FG(stream_wrappers), 0, NULL, NULL, 1); - zend_hash_copy(FG(stream_wrappers), &url_stream_wrappers_hash, NULL, &tmpwrapper, sizeof(php_stream_wrapper)); + clone_wrapper_hash(TSRMLS_C); } return zend_hash_del(FG(stream_wrappers), protocol, strlen(protocol)); @@ -1965,7 +1966,7 @@ PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char **path_for_open, int options TSRMLS_DC) { HashTable *wrapper_hash = (FG(stream_wrappers) ? FG(stream_wrappers) : &url_stream_wrappers_hash); - php_stream_wrapper *wrapper = NULL; + php_stream_wrapper **wrapperpp = NULL; const char *p, *protocol = NULL; int n = 0; @@ -1991,7 +1992,7 @@ } if (protocol) { - if (FAILURE == zend_hash_find(wrapper_hash, (char*)protocol, n, (void**)&wrapper)) { + if (FAILURE == zend_hash_find(wrapper_hash, (char*)protocol, n, (void**)&wrapperpp)) { char wrapper_name[32]; if (n >= sizeof(wrapper_name)) @@ -2001,7 +2002,7 @@ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unable to find the wrapper \"%s\" - did you forget to enable it when you configured PHP?", wrapper_name); - wrapper = NULL; + wrapperpp = NULL; protocol = NULL; } } @@ -2046,14 +2047,14 @@ if (FG(stream_wrappers)) { /* The file:// wrapper may have been disabled/overridden */ - if (wrapper) { + if (wrapperpp) { /* It was found so go ahead and provide it */ - return wrapper; + return *wrapperpp; } /* Check again, the original check might have not known the protocol name */ - if (zend_hash_find(wrapper_hash, "file", sizeof("file")-1, (void**)&wrapper) == SUCCESS) { - return wrapper; + if (zend_hash_find(wrapper_hash, "file", sizeof("file")-1, (void**)&wrapperpp) == SUCCESS) { + return *wrapperpp; } if (options & REPORT_ERRORS) { @@ -2066,14 +2067,14 @@ return &php_plain_files_wrapper; } - if ((wrapper && wrapper->is_url) && (!PG(allow_url_fopen) || ((options & STREAM_OPEN_FOR_INCLUDE) && !PG(allow_url_include))) ) { + if ((wrapperpp && (*wrapperpp)->is_url) && (!PG(allow_url_fopen) || ((options & STREAM_OPEN_FOR_INCLUDE) && !PG(allow_url_include))) ) { if (options & REPORT_ERRORS) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "URL file-access is disabled in the server configuration"); } return NULL; } - return wrapper; + return *wrapperpp; } /* }}} */ http://cvs.php.net/viewcvs.cgi/php-src/main/streams/userspace.c?r1=1.33&r2=1.34&diff_format=u Index: php-src/main/streams/userspace.c diff -u php-src/main/streams/userspace.c:1.33 php-src/main/streams/userspace.c:1.34 --- php-src/main/streams/userspace.c:1.33 Tue Feb 28 12:06:54 2006 +++ php-src/main/streams/userspace.c Sat Apr 22 23:49:39 2006 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: userspace.c,v 1.33 2006/02/28 12:06:54 helly Exp $ */ +/* $Id: userspace.c,v 1.34 2006/04/22 23:49:39 tony2001 Exp $ */ #include "php.h" #include "php_globals.h" @@ -464,7 +464,7 @@ { char *protocol; int protocol_len; - php_stream_wrapper *wrapper = NULL; + php_stream_wrapper **wrapperpp = NULL, *wrapper; HashTable *global_wrapper_hash; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &protocol, &protocol_len) == FAILURE) { @@ -477,11 +477,14 @@ RETURN_TRUE; } - if ((zend_hash_find(global_wrapper_hash, protocol, protocol_len, (void**)&wrapper) == FAILURE) || !wrapper) { + if ((zend_hash_find(global_wrapper_hash, protocol, protocol_len, (void**)&wrapperpp) == FAILURE) || !wrapperpp) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s:// never existed, nothing to restore", protocol); RETURN_FALSE; } + /* next line might delete the pointer that wrapperpp points at, so deref it now */ + wrapper = *wrapperpp; + /* A failure here could be okay given that the protocol might have been merely unregistered */ php_unregister_url_stream_wrapper_volatile(protocol TSRMLS_CC);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php