Fixed bug #77081 ftruncate() changes seek pointer in c mode

This commit is contained in:
Anatol Belski 2018-10-30 20:42:00 +01:00
parent 2816a3fdfa
commit 8827cc34cf
3 changed files with 31 additions and 3 deletions

3
NEWS
View File

@ -13,6 +13,9 @@ PHP NEWS
. Fixed bug #50675 (SoapClient can't handle object references correctly). . Fixed bug #50675 (SoapClient can't handle object references correctly).
(Cameron Porter) (Cameron Porter)
- Standard:
. Fixed bug #77081 (ftruncate() changes seek pointer in c mode). (cmb, Anatol)
- XML: - XML:
. Fixed bug 71592 (External entity processing never fails). (cmb) . Fixed bug 71592 (External entity processing never fails). (cmb)

View File

@ -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"

View File

@ -858,12 +858,13 @@ static int php_stdiop_set_option(php_stream *stream, int option, int value, void
return PHP_STREAM_OPTION_RETURN_ERR; return PHP_STREAM_OPTION_RETURN_ERR;
} }
LARGE_INTEGER old_sz; LARGE_INTEGER sz, old_sz;
if (!GetFileSizeEx(h, &old_sz)) { sz.QuadPart = 0;
if (!SetFilePointerEx(h, sz, &old_sz, FILE_CURRENT)) {
return PHP_STREAM_OPTION_RETURN_ERR; return PHP_STREAM_OPTION_RETURN_ERR;
} }
LARGE_INTEGER sz;
#if defined(_WIN64) #if defined(_WIN64)
sz.HighPart = (new_size >> 32); sz.HighPart = (new_size >> 32);
sz.LowPart = (new_size & 0xffffffff); sz.LowPart = (new_size & 0xffffffff);