diff options
author | Anatol Belski <ab@php.net> | 2018-06-09 11:23:06 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2018-06-09 11:28:24 +0200 |
commit | 9cd2d77514aa71359eac0ea080901e7c021681c9 (patch) | |
tree | 2681d011ccbe9e87c20341c7cd3661c7b34f4c34 /main | |
parent | 968eb0b38cc9095d418beb8f0df08c4b9abdb079 (diff) | |
download | php-git-9cd2d77514aa71359eac0ea080901e7c021681c9.tar.gz |
Fixed bug #76422 ftruncate fails on files > 2GB
Diffstat (limited to 'main')
-rw-r--r-- | main/streams/plain_wrapper.c | 22 |
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 } } |