diff --git a/ext/standard/tests/file/gh18753.phpt b/ext/standard/tests/file/gh18753.phpt new file mode 100644 index 0000000000000..a5bc8b8b7c680 --- /dev/null +++ b/ext/standard/tests/file/gh18753.phpt @@ -0,0 +1,29 @@ +--TEST-- +GH-18753 (file_get_contents() and file_put_contents() fail with data >=2GB on macOS & BSD) +--CREDITS-- +Gregory House <grzegorz129@gmail.com> +--INI-- +memory_limit=-1 +--SKIPIF-- +<?php +if (PHP_OS_FAMILY !== 'Darwin' && PHP_OS_FAMILY !== 'BSD') die('skip is not macOS or BSD'); +if (PHP_INT_SIZE !== 8) die("skip 64-bit only"); +if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); +?> +--FILE-- +<?php +echo "-- file_put_contents() --\n"; +echo file_put_contents('bigfile', str_repeat('a', 2 ** 31)); + +echo "\n-- file_get_contents() --\n"; +echo strlen(file_get_contents('bigfile')); +?> +--CLEAN-- +<?php +unlink('bigfile'); +?> +--EXPECT-- +-- file_put_contents() -- +2147483648 +-- file_get_contents() -- +2147483648 diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 1d5b7cfdac40d..8bbea2faa0df0 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -53,12 +53,16 @@ extern int php_get_uid_by_name(const char *name, uid_t *uid); extern int php_get_gid_by_name(const char *name, gid_t *gid); #endif -#if defined(PHP_WIN32) +#if defined(PHP_WIN32) || defined(__APPLE__) || defined(__MACH__) || defined(BSD) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) # define PLAIN_WRAP_BUF_SIZE(st) ((unsigned int)(st > INT_MAX ? INT_MAX : st)) +#else +# define PLAIN_WRAP_BUF_SIZE(st) (st) +#endif + +#if defined(PHP_WIN32) #define fsync _commit #define fdatasync fsync #else -# define PLAIN_WRAP_BUF_SIZE(st) (st) # if !defined(HAVE_FDATASYNC) # define fdatasync fsync # elif defined(__APPLE__) @@ -357,7 +361,7 @@ static ssize_t php_stdiop_write(php_stream *stream, const char *buf, size_t coun #ifdef PHP_WIN32 bytes_written = _write(data->fd, buf, PLAIN_WRAP_BUF_SIZE(count)); #else - bytes_written = write(data->fd, buf, count); + bytes_written = write(data->fd, buf, PLAIN_WRAP_BUF_SIZE(count)); #endif if (bytes_written < 0) { if (PHP_IS_TRANSIENT_ERROR(errno)) {