From d90ebb9f8599a286b3fe05e6bec48873e6c93eab Mon Sep 17 00:00:00 2001 From: John Sully Date: Mon, 17 Feb 2020 18:57:13 -0500 Subject: [PATCH] processEventsWhileBlocked not exception safe Former-commit-id: 45b711f9d124a948a66e667992176b5387943512 --- src/networking.cpp | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/networking.cpp b/src/networking.cpp index bbb24495c..242e69798 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -3183,6 +3183,7 @@ void unpauseClientsIfNecessary() * * The function returns the total number of events processed. */ int processEventsWhileBlocked(int iel) { + serverAssert(GlobalLocksAcquired()); int iterations = 4; /* See the function top-comment. */ int count = 0; @@ -3194,12 +3195,25 @@ int processEventsWhileBlocked(int iel) { } aeReleaseLock(); serverAssertDebug(!GlobalLocksAcquired()); - while (iterations--) { - int events = 0; - events += aeProcessEvents(g_pserver->rgthreadvar[iel].el, AE_FILE_EVENTS|AE_DONT_WAIT); - events += handleClientsWithPendingWrites(iel); - if (!events) break; - count += events; + try + { + while (iterations--) { + int events = 0; + events += aeProcessEvents(g_pserver->rgthreadvar[iel].el, AE_FILE_EVENTS|AE_DONT_WAIT); + events += handleClientsWithPendingWrites(iel); + if (!events) break; + count += events; + } + } + catch (...) + { + // Caller expects us to be locked so fix and rethrow + AeLocker locker; + if (c != nullptr) + c->lock.lock(); + locker.arm(c); + locker.release(); + throw; } AeLocker locker; if (c != nullptr)