Message ID | 20241209160504.1850443-1-jwakely@redhat.com |
---|---|
State | New |
Headers | show |
Series | [committed,v2] libstdc++: Add workaround for read(2) EINVAL on macOS and FreeBSD [PR102259] | expand |
diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index 9b529490f08..95e6905b3ad 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 6bc7930bdba..a9cbdbb557b 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 125dfdc1888..bb4a8442dcc 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