From: Marcus Boerger Date: Tue, 6 Nov 2007 11:02:36 +0000 (+0000) Subject: MFH streams stuff X-Git-Tag: RELEASE_1_3_1~718 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6362476b20a7dd9e3a3b39d8fc9316d4c9754e2d;p=php MFH streams stuff --- diff --git a/ext/standard/tests/file/include_userstream_002.phpt b/ext/standard/tests/file/include_userstream_002.phpt index 80690a9b19..d422a82769 100755 --- a/ext/standard/tests/file/include_userstream_002.phpt +++ b/ext/standard/tests/file/include_userstream_002.phpt @@ -97,7 +97,7 @@ include "test2://hello"; -Warning: fopen(): URL file-access is disabled in the server configuration in %sinclude_userstream_002.php on line 10 +Warning: fopen(): test1:// wrapper is disabled in the server configuration in %sinclude_userstream_002.php on line 10 Warning: fopen(test1://hello): failed to open stream: no suitable wrapper could be found in %sinclude_userstream_002.php on line 10 diff --git a/ext/standard/tests/file/stream_001.phpt b/ext/standard/tests/file/stream_001.phpt index 6df43471ea..67a4a6abd3 100644 --- a/ext/standard/tests/file/stream_001.phpt +++ b/ext/standard/tests/file/stream_001.phpt @@ -15,7 +15,7 @@ bool(true) Notice: fopen(): Unable to find the wrapper "file" - did you forget to enable it when you configured PHP? in %s on line %d -Warning: fopen(): Plainfiles wrapper disabled in %s on line %d +Warning: fopen(): file:// wrapper is disabled in the server configuration in %s on line %d Warning: fopen(file://%s): failed to open stream: no suitable wrapper could be found in %s on line %d bool(false) diff --git a/main/php_streams.h b/main/php_streams.h index 2a4bc86414..f420d9e23c 100755 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -220,7 +220,12 @@ struct _php_stream { int eof; +#if ZEND_DEBUG + char *open_filename; + uint open_lineno; +#endif }; /* php_stream */ + /* state definitions when closing down; these are private to streams.c */ #define PHP_STREAM_FCLOSE_NONE 0 #define PHP_STREAM_FCLOSE_FDOPEN 1 @@ -233,7 +238,6 @@ PHPAPI php_stream *_php_stream_alloc(php_stream_ops *ops, void *abstract, END_EXTERN_C() #define php_stream_alloc(ops, thisptr, persistent_id, mode) _php_stream_alloc((ops), (thisptr), (persistent_id), (mode) STREAMS_CC TSRMLS_CC) - #define php_stream_get_resource_id(stream) (stream)->rsrc_id #if ZEND_DEBUG /* use this to tell the stream that it is OK if we don't explicitly close it */ @@ -430,6 +434,7 @@ END_EXTERN_C() #include "streams/php_stream_transport.h" #include "streams/php_stream_plain_wrapper.h" +#include "streams/php_stream_glob_wrapper.h" #include "streams/php_stream_userspace.h" #include "streams/php_stream_mmap.h" @@ -464,14 +469,15 @@ END_EXTERN_C() /* Wrappers support */ -#define IGNORE_PATH 0 -#define USE_PATH 1 -#define IGNORE_URL 2 -#define ENFORCE_SAFE_MODE 4 -#define REPORT_ERRORS 8 +#define IGNORE_PATH 0x00000000 +#define USE_PATH 0x00000001 +#define IGNORE_URL 0x00000002 +#define ENFORCE_SAFE_MODE 0x00000004 +#define REPORT_ERRORS 0x00000008 + /* If you don't need to write to the stream, but really need to * be able to seek, use this flag in your options. */ -#define STREAM_MUST_SEEK 16 +#define STREAM_MUST_SEEK 0x00000010 /* If you are going to end up casting the stream into a FILE* or * a socket, pass this flag and the streams/wrappers will not use * buffering mechanisms while reading the headers, so that HTTP @@ -479,25 +485,28 @@ END_EXTERN_C() * If you omit this flag, streams will use buffering and should end * up working more optimally. * */ -#define STREAM_WILL_CAST 32 +#define STREAM_WILL_CAST 0x00000020 /* this flag applies to php_stream_locate_url_wrapper */ -#define STREAM_LOCATE_WRAPPERS_ONLY 64 +#define STREAM_LOCATE_WRAPPERS_ONLY 0x00000040 /* this flag is only used by include/require functions */ -#define STREAM_OPEN_FOR_INCLUDE 128 +#define STREAM_OPEN_FOR_INCLUDE 0x00000080 /* this flag tells streams to ONLY open urls */ -#define STREAM_USE_URL 256 +#define STREAM_USE_URL 0x00000100 /* this flag is used when only the headers from HTTP request are to be fetched */ -#define STREAM_ONLY_GET_HEADERS 512 +#define STREAM_ONLY_GET_HEADERS 0x00000200 /* don't apply open_basedir checks */ -#define STREAM_DISABLE_OPEN_BASEDIR 1024 +#define STREAM_DISABLE_OPEN_BASEDIR 0x00000400 /* get (or create) a persistent version of the stream */ -#define STREAM_OPEN_PERSISTENT 2048 +#define STREAM_OPEN_PERSISTENT 0x00000800 + +/* use glob stream for directory open in plain files stream */ +#define STREAM_USE_GLOB_DIR_OPEN 0x00001000 /* don't check allow_url_fopen and allow_url_include */ #define STREAM_DISABLE_URL_PROTECTION 0x00002000 @@ -550,12 +559,12 @@ PHPAPI HashTable *php_stream_get_url_stream_wrappers_hash_global(void); PHPAPI HashTable *_php_get_stream_filters_hash(TSRMLS_D); #define php_get_stream_filters_hash() _php_get_stream_filters_hash(TSRMLS_C) PHPAPI HashTable *php_get_stream_filters_hash_global(void); +extern php_stream_wrapper_ops *php_stream_user_wrapper_ops; END_EXTERN_C() #endif /* Definitions for user streams */ #define PHP_STREAM_IS_URL 1 - /* * Local variables: * tab-width: 4 diff --git a/main/streams/cast.c b/main/streams/cast.c index e1f71216d0..02e2282b68 100644 --- a/main/streams/cast.c +++ b/main/streams/cast.c @@ -327,6 +327,11 @@ PHPAPI int _php_stream_make_seekable(php_stream *origstream, php_stream **newstr if (*newstream == NULL) return PHP_STREAM_FAILED; +#if ZEND_DEBUG + (*newstream)->open_filename = origstream->open_filename; + (*newstream)->open_lineno = origstream->open_lineno; +#endif + if (php_stream_copy_to_stream(origstream, *newstream, PHP_STREAM_COPY_ALL) == 0) { php_stream_close(*newstream); *newstream = NULL; diff --git a/main/streams/streams.c b/main/streams/streams.c index ae45653d55..fcc717379b 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -240,6 +240,11 @@ fprintf(stderr, "stream_alloc: %s:%p persistent=%s\n", ops->label, ret, persiste ret->is_persistent = persistent_id ? 1 : 0; ret->chunk_size = FG(def_chunk_size); +#if ZEND_DEBUG + ret->open_filename = __zend_orig_filename ? __zend_orig_filename : __zend_filename; + ret->open_lineno = __zend_orig_lineno ? __zend_orig_lineno : __zend_lineno; +#endif + if (FG(auto_detect_line_endings)) { ret->flags |= PHP_STREAM_FLAG_DETECT_EOL; } @@ -490,11 +495,10 @@ static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_D } memcpy(stream->readbuf + stream->writepos, bucket->buf, bucket->buflen); stream->writepos += bucket->buflen; - + php_stream_bucket_unlink(bucket TSRMLS_CC); php_stream_bucket_delref(bucket TSRMLS_CC); } - break; case PSFS_FEED_ME: @@ -1324,8 +1328,9 @@ PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, size while(1) { readchunk = sizeof(buf); - if (maxlen && (maxlen - haveread) < readchunk) + if (maxlen && (maxlen - haveread) < readchunk) { readchunk = maxlen - haveread; + } didread = php_stream_read(src, buf, readchunk); @@ -1355,8 +1360,8 @@ PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, size break; } } - return haveread; + return haveread; } /* }}} */ @@ -1522,7 +1527,7 @@ PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char /* BC with older php scripts and zlib wrapper */ protocol = "compress.zlib"; n = 13; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Use of \"zlib:\" wrapper is deprecated; please use \"compress.zlib://\" instead."); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Use of \"zlib:\" wrapper is deprecated; please use \"compress.zlib://\" instead"); } if (protocol) { @@ -1547,6 +1552,9 @@ PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char } /* TODO: curl based streams probably support file:// properly */ if (!protocol || !strncasecmp(protocol, "file", n)) { + /* fall back on regular file access */ + php_stream_wrapper *plain_files_wrapper = &php_plain_files_wrapper; + if (protocol) { int localhost = 0; @@ -1597,13 +1605,12 @@ PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char } if (options & REPORT_ERRORS) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Plainfiles wrapper disabled"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "file:// wrapper is disabled in the server configuration"); } return NULL; } - - /* fall back on regular file access */ - return &php_plain_files_wrapper; + + return plain_files_wrapper; } if (wrapperpp && (*wrapperpp)->is_url && @@ -1612,7 +1619,10 @@ PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char (((options & STREAM_OPEN_FOR_INCLUDE) || PG(in_user_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"); + /* protocol[n] probably isn't '\0' */ + char *protocol_dup = estrndup(protocol, n); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s:// wrapper is disabled in the server configuration", protocol_dup); + efree(protocol_dup); } return NULL; } @@ -1768,7 +1778,7 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int optio wrapper = php_stream_locate_url_wrapper(path, &path_to_open, options TSRMLS_CC); if (options & STREAM_USE_URL && (!wrapper || !wrapper->is_url)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "This function may only be used against URLs."); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "This function may only be used against URLs"); return NULL; } @@ -1802,6 +1812,10 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int optio } copy_of_path = pestrdup(path, persistent); stream->orig_path = copy_of_path; +#if ZEND_DEBUG + stream->open_filename = __zend_orig_filename ? __zend_orig_filename : __zend_filename; + stream->open_lineno = __zend_orig_lineno ? __zend_orig_lineno : __zend_lineno; +#endif } if (stream != NULL && (options & STREAM_MUST_SEEK)) {