diff options
-rw-r--r-- | ext/standard/tests/file/ftruncate_bug77081.phpt | 24 | ||||
-rw-r--r-- | main/streams/plain_wrapper.c | 11 |
2 files changed, 30 insertions, 5 deletions
diff --git a/ext/standard/tests/file/ftruncate_bug77081.phpt b/ext/standard/tests/file/ftruncate_bug77081.phpt new file mode 100644 index 0000000000..7a9aa691fb --- /dev/null +++ b/ext/standard/tests/file/ftruncate_bug77081.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #77081 ftruncate() changes seek pointer in c mode +--FILE-- +<?php + +$filename = dirname(__FILE__) . DIRECTORY_SEPARATOR . "test77081"; + +file_put_contents($filename, 'foo'); +$stream = fopen($filename, 'c'); +ftruncate($stream, 0); +var_dump(ftell($stream)); +fwrite($stream, 'bar'); +fclose($stream); +var_dump(file_get_contents($filename)); + +?> +--CLEAN-- +<?php +$fn = dirname(__FILE__) . DIRECTORY_SEPARATOR . "test77081"; +unlink($fn); +?> +--EXPECT-- +int(0) +string(3) "bar" diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index fdfc7b4f63..fca245e027 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -858,12 +858,13 @@ static int php_stdiop_set_option(php_stream *stream, int option, int value, void return PHP_STREAM_OPTION_RETURN_ERR; } - LARGE_INTEGER old_sz; - if (!GetFileSizeEx(h, &old_sz)) { + LARGE_INTEGER sz, old_sz; + sz.QuadPart = 0; + + if (!SetFilePointerEx(h, sz, &old_sz, FILE_CURRENT)) { return PHP_STREAM_OPTION_RETURN_ERR; } - LARGE_INTEGER sz; #if defined(_WIN64) sz.HighPart = (new_size >> 32); sz.LowPart = (new_size & 0xffffffff); @@ -871,13 +872,13 @@ static int php_stdiop_set_option(php_stream *stream, int option, int value, void sz.HighPart = 0; sz.LowPart = new_size; #endif - if (INVALID_SET_FILE_POINTER == SetFilePointerEx(h, sz, NULL, FILE_BEGIN) && NO_ERROR != GetLastError()) { + if (!SetFilePointerEx(h, sz, NULL, FILE_BEGIN)) { return PHP_STREAM_OPTION_RETURN_ERR; } if (0 == SetEndOfFile(h)) { return PHP_STREAM_OPTION_RETURN_ERR; } - if (INVALID_SET_FILE_POINTER == SetFilePointerEx(h, old_sz, NULL, FILE_BEGIN) && NO_ERROR != GetLastError()) { + if (!SetFilePointerEx(h, old_sz, NULL, FILE_BEGIN)) { return PHP_STREAM_OPTION_RETURN_ERR; } return PHP_STREAM_OPTION_RETURN_OK; |