diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index 9b529490f08903ae701163dcb90660a2dd41f046..95e6905b3adf43c2533271d712d4849643c5158b 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -338,6 +338,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (__ret == 0 && ferror(this->file())) __ret = -1; #else + +#ifdef _GLIBCXX_MAX_READ_SIZE + if (__builtin_expect(__n > _GLIBCXX_MAX_READ_SIZE, 0)) + __n = _GLIBCXX_MAX_READ_SIZE; +#endif + do __ret = read(this->fd(), __s, __n); while (__ret == -1L && errno == EINTR); diff --git a/libstdc++-v3/config/os/bsd/darwin/os_defines.h b/libstdc++-v3/config/os/bsd/darwin/os_defines.h index 6bc7930bdba0964656935ae20f5f45236a20cc97..a9cbdbb557bfbdd567196922a4dfd7c14bf41d9f 100644 --- a/libstdc++-v3/config/os/bsd/darwin/os_defines.h +++ b/libstdc++-v3/config/os/bsd/darwin/os_defines.h @@ -54,4 +54,7 @@ // No support for referencing weak symbols without a definition. #define _GLIBCXX_USE_WEAK_REF 0 +// read(2) can return EINVAL for n >= INT_MAX. +#define _GLIBCXX_MAX_READ_SIZE (__INT_MAX__ - 1) + #endif diff --git a/libstdc++-v3/config/os/bsd/freebsd/os_defines.h b/libstdc++-v3/config/os/bsd/freebsd/os_defines.h index 125dfdc18885755ad726e9772776e8fea88078ee..bb4a8442dcce5e673dfec7211968134fac8ea27c 100644 --- a/libstdc++-v3/config/os/bsd/freebsd/os_defines.h +++ b/libstdc++-v3/config/os/bsd/freebsd/os_defines.h @@ -50,4 +50,7 @@ #define _GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_DYNAMIC 0 #endif +// read(2) can return EINVAL for n >= INT_MAX. +#define _GLIBCXX_MAX_READ_SIZE (__INT_MAX__ - 1) + #endif