From e30060da154272343781c7eb89f68ff8d73c2431 Mon Sep 17 00:00:00 2001 From: Francois Laupretre Date: Wed, 30 Dec 2015 14:23:37 +0100 Subject: [PATCH] file_get_contents(): Add support for negative offset --- ext/standard/file.c | 4 +- ext/standard/tests/file/bug39673.phpt | 6 +- .../file_get_contents_variation5_32bit.phpt | 236 ++++++++++++++++++ ...> file_get_contents_variation5_64bit.phpt} | 19 +- 4 files changed, 256 insertions(+), 9 deletions(-) create mode 100644 ext/standard/tests/file/file_get_contents_variation5_32bit.phpt rename ext/standard/tests/file/{file_get_contents_variation5.phpt => file_get_contents_variation5_64bit.phpt} (91%) diff --git a/ext/standard/file.c b/ext/standard/file.c index 26f5c161ce..0bf1c85229 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -518,7 +518,7 @@ PHP_FUNCTION(file_get_contents) size_t filename_len; zend_bool use_include_path = 0; php_stream *stream; - zend_long offset = -1; + zend_long offset = 0; zend_long maxlen = (ssize_t) PHP_STREAM_COPY_ALL; zval *zcontext = NULL; php_stream_context *context = NULL; @@ -543,7 +543,7 @@ PHP_FUNCTION(file_get_contents) RETURN_FALSE; } - if (offset > 0 && php_stream_seek(stream, offset, SEEK_SET) < 0) { + if (offset != 0 && php_stream_seek(stream, offset, ((offset > 0) ? SEEK_SET : SEEK_END)) < 0) { php_error_docref(NULL, E_WARNING, "Failed to seek to position " ZEND_LONG_FMT " in the stream", offset); php_stream_close(stream); RETURN_FALSE; diff --git a/ext/standard/tests/file/bug39673.phpt b/ext/standard/tests/file/bug39673.phpt index 3836f2103d..00c29b28da 100644 --- a/ext/standard/tests/file/bug39673.phpt +++ b/ext/standard/tests/file/bug39673.phpt @@ -22,14 +22,14 @@ $offsets = array( foreach ($offsets as $offset) { $r = file_get_contents($filename, false, null, $offset); - var_dump(strlen($r)); + if ($r !== false) var_dump(strlen($r)); } @unlink($filename); echo "Done\n"; ?> ---EXPECTF-- -int(13824) +--EXPECTF-- +int(1) int(13824) int(0) int(1) diff --git a/ext/standard/tests/file/file_get_contents_variation5_32bit.phpt b/ext/standard/tests/file/file_get_contents_variation5_32bit.phpt new file mode 100644 index 0000000000..3afc3dc180 --- /dev/null +++ b/ext/standard/tests/file/file_get_contents_variation5_32bit.phpt @@ -0,0 +1,236 @@ +--TEST-- +Test file_get_contents() function : usage variation +--CREDITS-- +Dave Kelsey +--SKIPIF-- + 1, 'two' => 2); + +//array of values to iterate over +$inputs = array( + + // int data + 'int 0' => 0, + 'int 1' => 1, + 'int 12345' => 12345, + 'int -12345' => -12345, + 'int -10' => -10, + + // float data + 'float 10.5' => 10.5, + 'float -10.5' => -10.5, + 'float -22.5' => -22.5, + 'float 12.3456789000e10' => 12.3456789000e10, + 'float -12.3456789000e10' => -12.3456789000e10, + 'float .5' => .5, + + // array data + 'empty array' => array(), + 'int indexed array' => $index_array, + 'associative array' => $assoc_array, + 'nested arrays' => array('foo', $index_array, $assoc_array), + + // null data + 'uppercase NULL' => NULL, + 'lowercase null' => null, + + // boolean data + 'lowercase true' => true, + 'lowercase false' =>false, + 'uppercase TRUE' =>TRUE, + 'uppercase FALSE' =>FALSE, + + // empty data + 'empty string DQ' => "", + 'empty string SQ' => '', + + // string data + 'string DQ' => "string", + 'string SQ' => 'string', + 'mixed case string' => "sTrInG", + 'heredoc' => $heredoc, + + // object data + 'instance of classWithToString' => new classWithToString(), + 'instance of classWithoutToString' => new classWithoutToString(), + + // undefined data + 'undefined var' => @$undefined_var, + + // unset data + 'unset var' => @$unset_var, +); + +// loop through each element of the array for offset + +foreach($inputs as $key =>$value) { + echo "\n--$key--\n"; + var_dump( file_get_contents($absFile, false, null, $value) ); +}; + +unlink($absFile); + +?> +===DONE=== +--EXPECTF-- +*** Testing file_get_contents() : usage variation *** + +--int 0-- +string(%d) "contents read" + +--int 1-- +string(%d) "ontents read" + +--int 12345-- +string(%d) "" + +--int -12345-- +Error: 2 - file_get_contents(): Failed to seek to position -12345 in the stream, %s(%d) +bool(false) + +--int -10-- +string(10) "tents read" + +--float 10.5-- +string(3) "ead" + +--float -10.5-- +string(10) "tents read" + +--float -22.5-- +Error: 2 - file_get_contents(): Failed to seek to position -22 in the stream, %s(%d) +bool(false) + +--float 12.3456789000e10-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, float given, %s(%d) +NULL + +--float -12.3456789000e10-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, float given, %s(%d) +NULL + +--float .5-- +string(%d) "contents read" + +--empty array-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, array given, %s(%d) +NULL + +--int indexed array-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, array given, %s(%d) +NULL + +--associative array-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, array given, %s(%d) +NULL + +--nested arrays-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, array given, %s(%d) +NULL + +--uppercase NULL-- +string(%d) "contents read" + +--lowercase null-- +string(%d) "contents read" + +--lowercase true-- +string(12) "ontents read" + +--lowercase false-- +string(%d) "contents read" + +--uppercase TRUE-- +string(12) "ontents read" + +--uppercase FALSE-- +string(%d) "contents read" + +--empty string DQ-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, %unicode_string_optional% given, %s(%d) +NULL + +--empty string SQ-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, %unicode_string_optional% given, %s(%d) +NULL + +--string DQ-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, %unicode_string_optional% given, %s(%d) +NULL + +--string SQ-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, %unicode_string_optional% given, %s(%d) +NULL + +--mixed case string-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, %unicode_string_optional% given, %s(%d) +NULL + +--heredoc-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, %unicode_string_optional% given, %s(%d) +NULL + +--instance of classWithToString-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, object given, %s(%d) +NULL + +--instance of classWithoutToString-- +Error: 2 - file_get_contents() expects parameter 4 to be integer, object given, %s(%d) +NULL + +--undefined var-- +string(%d) "contents read" + +--unset var-- +string(%d) "contents read" +===DONE=== diff --git a/ext/standard/tests/file/file_get_contents_variation5.phpt b/ext/standard/tests/file/file_get_contents_variation5_64bit.phpt similarity index 91% rename from ext/standard/tests/file/file_get_contents_variation5.phpt rename to ext/standard/tests/file/file_get_contents_variation5_64bit.phpt index aa13d69eb8..df33059f30 100644 --- a/ext/standard/tests/file/file_get_contents_variation5.phpt +++ b/ext/standard/tests/file/file_get_contents_variation5_64bit.phpt @@ -63,11 +63,13 @@ $inputs = array( 'int 0' => 0, 'int 1' => 1, 'int 12345' => 12345, - 'int -12345' => -2345, + 'int -12345' => -12345, + 'int -10' => -10, // float data 'float 10.5' => 10.5, 'float -10.5' => -10.5, + 'float -22.5' => -22.5, 'float 12.3456789000e10' => 12.3456789000e10, 'float -12.3456789000e10' => -12.3456789000e10, 'float .5' => .5, @@ -133,19 +135,28 @@ string(%d) "ontents read" string(%d) "" --int -12345-- -string(%d) "contents read" +Error: 2 - file_get_contents(): Failed to seek to position -12345 in the stream, %s(%d) +bool(false) + +--int -10-- +string(10) "tents read" --float 10.5-- string(3) "ead" --float -10.5-- -string(%d) "contents read" +string(10) "tents read" + +--float -22.5-- +Error: 2 - file_get_contents(): Failed to seek to position -22 in the stream, %s(%d) +bool(false) --float 12.3456789000e10-- string(%d) %s --float -12.3456789000e10-- -string(%d) %s +Error: 2 - file_get_contents(): Failed to seek to position -123456789000 in the stream, %s(%d) +bool(false) --float .5-- string(%d) "contents read" -- 2.50.1