summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2018-06-09 11:23:06 +0200
committerAnatol Belski <ab@php.net>2018-06-09 11:28:24 +0200
commit9cd2d77514aa71359eac0ea080901e7c021681c9 (patch)
tree2681d011ccbe9e87c20341c7cd3661c7b34f4c34 /main
parent968eb0b38cc9095d418beb8f0df08c4b9abdb079 (diff)
downloadphp-git-9cd2d77514aa71359eac0ea080901e7c021681c9.tar.gz
Fixed bug #76422 ftruncate fails on files > 2GB
Diffstat (limited to 'main')
-rw-r--r--main/streams/plain_wrapper.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c
index 7657b35faf..285b12b052 100644
--- a/main/streams/plain_wrapper.c
+++ b/main/streams/plain_wrapper.c
@@ -854,7 +854,29 @@ static int php_stdiop_set_option(php_stream *stream, int option, int value, void
if (new_size < 0) {
return PHP_STREAM_OPTION_RETURN_ERR;
}
+#ifdef PHP_WIN32
+ HANDLE h = (HANDLE) _get_osfhandle(fd);
+ if (INVALID_HANDLE_VALUE == h) {
+ return PHP_STREAM_OPTION_RETURN_ERR;
+ }
+ LARGE_INTEGER sz;
+#if defined(_WIN64)
+ sz.HighPart = (new_size >> 32);
+ sz.LowPart = (new_size & 0xffffffff);
+#else
+ sz.HighPart = 0;
+ sz.LowPart = new_size;
+#endif
+ if (INVALID_SET_FILE_POINTER == SetFilePointerEx(h, sz, NULL, FILE_BEGIN) && NO_ERROR != GetLastError()) {
+ return PHP_STREAM_OPTION_RETURN_ERR;
+ }
+ if (0 == SetEndOfFile(h)) {
+ return PHP_STREAM_OPTION_RETURN_ERR;
+ }
+ return PHP_STREAM_OPTION_RETURN_OK;
+#else
return ftruncate(fd, new_size) == 0 ? PHP_STREAM_OPTION_RETURN_OK : PHP_STREAM_OPTION_RETURN_ERR;
+#endif
}
}