From: Anatol Belski Date: Tue, 30 Oct 2018 19:42:00 +0000 (+0100) Subject: Fixed bug #77081 ftruncate() changes seek pointer in c mode X-Git-Tag: php-7.3.0RC5~21 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8827cc34cf8c77828330182ee1e6d0b9438d489c;p=php Fixed bug #77081 ftruncate() changes seek pointer in c mode --- diff --git a/NEWS b/NEWS index 17dbea657d..34533b8872 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,9 @@ PHP NEWS . Fixed bug #50675 (SoapClient can't handle object references correctly). (Cameron Porter) +- Standard: + . Fixed bug #77081 (ftruncate() changes seek pointer in c mode). (cmb, Anatol) + - XML: . Fixed bug 71592 (External entity processing never fails). (cmb) 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-- + +--CLEAN-- + +--EXPECT-- +int(0) +string(3) "bar" diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index fdfc7b4f63..d8e1f517b4 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);