From f76da1b96c1bc58bd4272366969cd9c836243340 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 22 Jul 2008 14:06:17 +0000 Subject: [PATCH] - Fixed bug #44246 (closedir() accepts a file resource opened by fopen()) --- ext/standard/file.c | 10 ++++++++++ ext/standard/fsock.c | 2 ++ ext/standard/proc_open.c | 2 +- ext/standard/streamsfuncs.c | 9 ++++++++- ext/standard/tests/file/fscanf_variation10.phpt | 2 +- ext/standard/tests/file/fscanf_variation16.phpt | 2 +- ext/standard/tests/file/fscanf_variation22.phpt | 2 +- ext/standard/tests/file/fscanf_variation29.phpt | 2 +- ext/standard/tests/file/fscanf_variation35.phpt | 2 +- ext/standard/tests/file/fscanf_variation4.phpt | 2 +- ext/standard/tests/file/fscanf_variation41.phpt | 2 +- ext/standard/tests/file/fscanf_variation47.phpt | 2 +- ext/standard/tests/strings/sprintf_variation23.phpt | 2 +- main/php_streams.h | 2 ++ sapi/cli/php_cli.c | 4 ++++ 15 files changed, 36 insertions(+), 11 deletions(-) diff --git a/ext/standard/file.c b/ext/standard/file.c index 26a9925705..b7e807b163 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -965,6 +965,8 @@ PHP_NAMED_FUNCTION(php_if_tmpfile) stream = php_stream_fopen_tmpfile(); if (stream) { + stream->flags |= PHP_STREAM_FLAG_FCLOSE; + php_stream_to_zval(stream, return_value); } else { RETURN_FALSE; @@ -998,6 +1000,8 @@ PHP_NAMED_FUNCTION(php_if_fopen) if (stream == NULL) { RETURN_FALSE; } + + stream->flags |= PHP_STREAM_FLAG_FCLOSE; php_stream_to_zval(stream, return_value); } @@ -1015,6 +1019,12 @@ PHPAPI PHP_FUNCTION(fclose) } PHP_STREAM_TO_ZVAL(stream, arg1); + + if (!(stream->flags & PHP_STREAM_FLAG_FCLOSE)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a valid stream resource", stream->rsrc_id); + RETURN_FALSE; + } + if (!stream->is_persistent) { zend_list_delete(stream->rsrc_id); } else { diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c index 1dc2215666..84ed477a0e 100644 --- a/ext/standard/fsock.c +++ b/ext/standard/fsock.c @@ -79,6 +79,8 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) stream = php_stream_xport_create(hostname, hostname_len, REPORT_ERRORS, STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT, hashkey, &tv, NULL, &errstr, &err); + stream->flags |= PHP_STREAM_FLAG_FCLOSE; + if (port > 0) { efree(hostname); } diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index 67dd956fa1..0ae8d9c211 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -971,7 +971,7 @@ PHP_FUNCTION(proc_open) zval *retfp; /* nasty hack; don't copy it */ - stream->flags |= PHP_STREAM_FLAG_NO_SEEK; + stream->flags |= PHP_STREAM_FLAG_NO_SEEK | PHP_STREAM_FLAG_FCLOSE; if (UG(unicode) && !binary_pipes) { if (write_stream) { diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index a0a7245b09..521ed3d024 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -126,6 +126,7 @@ PHP_FUNCTION(stream_socket_client) STREAM_XPORT_CLIENT | (flags & PHP_STREAM_CLIENT_CONNECT ? STREAM_XPORT_CONNECT : 0) | (flags & PHP_STREAM_CLIENT_ASYNC_CONNECT ? STREAM_XPORT_CONNECT_ASYNC : 0), hashkey, &tv, context, &errstr, &err); + if (stream == NULL) { /* host might contain binary characters */ @@ -155,6 +156,8 @@ PHP_FUNCTION(stream_socket_client) RETURN_FALSE; } + stream->flags |= PHP_STREAM_FLAG_FCLOSE; + if (errstr) { efree(errstr); } @@ -201,6 +204,8 @@ PHP_FUNCTION(stream_socket_server) stream = php_stream_xport_create(host, host_len, REPORT_ERRORS, STREAM_XPORT_SERVER | flags, NULL, NULL, context, &errstr, &err); + + stream->flags |= PHP_STREAM_FLAG_FCLOSE; if (stream == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s (%s)", host, errstr == NULL ? "Unknown error" : errstr); @@ -267,7 +272,9 @@ PHP_FUNCTION(stream_socket_accept) NULL, NULL, &tv, &errstr TSRMLS_CC) && clistream) { - + + clistream->flags |= PHP_STREAM_FLAG_FCLOSE; + if (peername) { ZVAL_RT_STRINGL(zpeername, peername, peername_len, ZSTR_AUTOFREE); } diff --git a/ext/standard/tests/file/fscanf_variation10.phpt b/ext/standard/tests/file/fscanf_variation10.phpt index 8cd7e32be9..d33bd56df0 100644 --- a/ext/standard/tests/file/fscanf_variation10.phpt +++ b/ext/standard/tests/file/fscanf_variation10.phpt @@ -68,7 +68,7 @@ foreach($float_formats as $float_format) { // closing the resources fclose($fp); -fclose($dfp); +closedir($dfp); echo "\n*** Done ***"; ?> diff --git a/ext/standard/tests/file/fscanf_variation16.phpt b/ext/standard/tests/file/fscanf_variation16.phpt index 1312c18de7..94009248c4 100644 --- a/ext/standard/tests/file/fscanf_variation16.phpt +++ b/ext/standard/tests/file/fscanf_variation16.phpt @@ -67,7 +67,7 @@ foreach($string_formats as $string_format) { // closing the resources fclose($fp); -fclose($dfp); +closedir($dfp); echo "\n*** Done ***"; ?> diff --git a/ext/standard/tests/file/fscanf_variation22.phpt b/ext/standard/tests/file/fscanf_variation22.phpt index d43226a4f3..8fa62deb44 100644 --- a/ext/standard/tests/file/fscanf_variation22.phpt +++ b/ext/standard/tests/file/fscanf_variation22.phpt @@ -67,7 +67,7 @@ foreach($char_formats as $char_format) { // closing the resources fclose($fp); -fclose($dfp); +closedir($dfp); echo "\n*** Done ***"; ?> diff --git a/ext/standard/tests/file/fscanf_variation29.phpt b/ext/standard/tests/file/fscanf_variation29.phpt index edc7422699..8b82223138 100644 --- a/ext/standard/tests/file/fscanf_variation29.phpt +++ b/ext/standard/tests/file/fscanf_variation29.phpt @@ -68,7 +68,7 @@ foreach($octal_formats as $octal_format) { // closing the resources fclose($fp); -fclose($dfp); +closedir($dfp); echo "\n*** Done ***"; ?> diff --git a/ext/standard/tests/file/fscanf_variation35.phpt b/ext/standard/tests/file/fscanf_variation35.phpt index d259f12d4b..af0266d1a6 100644 --- a/ext/standard/tests/file/fscanf_variation35.phpt +++ b/ext/standard/tests/file/fscanf_variation35.phpt @@ -63,7 +63,7 @@ foreach($hexa_formats as $hexa_format) { // closing the resources fclose($fp); -fclose($dfp); +closedir($dfp); echo "\n*** Done ***"; ?> diff --git a/ext/standard/tests/file/fscanf_variation4.phpt b/ext/standard/tests/file/fscanf_variation4.phpt index 03af8494bc..599acd8ddf 100644 --- a/ext/standard/tests/file/fscanf_variation4.phpt +++ b/ext/standard/tests/file/fscanf_variation4.phpt @@ -64,7 +64,7 @@ foreach($int_formats as $int_format) { // closing the resources fclose($fp); -fclose($dfp); +closedir($dfp); echo "\n*** Done ***"; ?> diff --git a/ext/standard/tests/file/fscanf_variation41.phpt b/ext/standard/tests/file/fscanf_variation41.phpt index 76faf0b09e..a1d11c1330 100644 --- a/ext/standard/tests/file/fscanf_variation41.phpt +++ b/ext/standard/tests/file/fscanf_variation41.phpt @@ -63,7 +63,7 @@ foreach($unsigned_formats as $unsigned_format) { // closing the resources fclose($fp); -fclose($dfp); +closedir($dfp); echo "\n*** Done ***"; ?> diff --git a/ext/standard/tests/file/fscanf_variation47.phpt b/ext/standard/tests/file/fscanf_variation47.phpt index 011169a5c3..183ee7a822 100644 --- a/ext/standard/tests/file/fscanf_variation47.phpt +++ b/ext/standard/tests/file/fscanf_variation47.phpt @@ -63,7 +63,7 @@ foreach($scientific_formats as $scientific_format) { // closing the resources fclose($fp); -fclose($dfp); +closedir($dfp); echo "\n*** Done ***"; ?> diff --git a/ext/standard/tests/strings/sprintf_variation23.phpt b/ext/standard/tests/strings/sprintf_variation23.phpt index 498048cff3..78b0e3dc2f 100644 --- a/ext/standard/tests/strings/sprintf_variation23.phpt +++ b/ext/standard/tests/strings/sprintf_variation23.phpt @@ -39,7 +39,7 @@ foreach($resource_values as $resource_value) { // closing the resources fclose($fp); -fclose($dfp); +closedir($dfp); echo "Done"; ?> diff --git a/main/php_streams.h b/main/php_streams.h index 4368aa8a29..fcffeafedd 100755 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -191,6 +191,8 @@ struct _php_stream_wrapper { #define PHP_STREAM_FLAG_IS_DIR 64 +#define PHP_STREAM_FLAG_FCLOSE 128 + struct _php_stream { php_stream_ops *ops; void *abstract; /* convenience pointer for abstraction */ diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 7bca968aef..ccac5166ec 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -516,6 +516,10 @@ static void cli_register_file_handles(TSRMLS_D) /* {{{ */ if (s_err) php_stream_close(s_err); return; } + + s_in->flags |= PHP_STREAM_FLAG_FCLOSE; + s_out->flags |= PHP_STREAM_FLAG_FCLOSE; + s_err->flags |= PHP_STREAM_FLAG_FCLOSE; #if PHP_DEBUG /* do not close stdout and stderr */ -- 2.50.1