summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2018-10-30 20:42:00 +0100
committerAnatol Belski <ab@php.net>2018-10-30 20:42:00 +0100
commit8827cc34cf8c77828330182ee1e6d0b9438d489c (patch)
tree7d3ef13d5805f48c28ecda981d2ccf8069800e9e
parent2816a3fdfa23cf0711251b8d1e9ffad3d281ea96 (diff)
downloadphp-git-8827cc34cf8c77828330182ee1e6d0b9438d489c.tar.gz
Fixed bug #77081 ftruncate() changes seek pointer in c mode
-rw-r--r--NEWS3
-rw-r--r--ext/standard/tests/file/ftruncate_bug77081.phpt24
-rw-r--r--main/streams/plain_wrapper.c7
3 files changed, 31 insertions, 3 deletions
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--
+<?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..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);