From e0e0be873b8a356851300f6c53e4f9b97acb8b12 Mon Sep 17 00:00:00 2001 From: SimulPiscator Date: Thu, 15 Feb 2024 13:48:09 +0100 Subject: [PATCH] Add proper EINTR handling --- basic/fdbuf.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/basic/fdbuf.cpp b/basic/fdbuf.cpp index 3ff2a72..c118496 100644 --- a/basic/fdbuf.cpp +++ b/basic/fdbuf.cpp @@ -58,11 +58,15 @@ fdbuf::sync() const char* p = pbase(); while (n > 0) { int written = ::write(mFd, p, n); - if (written < 0) - return -1; - n -= written; - p += written; - mTotalWritten += written; + if (written < 0) { + if (errno != EINTR) + return -1; + } + else { // written >= 0 + n -= written; + p += written; + mTotalWritten += written; + } } return 0; } @@ -88,9 +92,10 @@ fdbuf::underflow() return traits_type::eof(); int read = ::read(mFd, start, n); - if (read == 0) + if (read == 0 || (read < 0 && errno != EINTR)) return traits_type::eof(); - setg(mInbuf, start, start + read); + if (read > 0) + setg(mInbuf, start, start + read); } return traits_type::to_int_type(*gptr()); }