From f68443d4bae79aec9ed0aad09edef57fbe20e11d Mon Sep 17 00:00:00 2001 From: Simon Jarbrant Date: Sun, 16 May 2021 15:54:06 +0200 Subject: [PATCH 1/2] Add additional locking in DemandBuffer to protect demandState This fixes thread race issues when (for example) a subscriber created by `AnyPublisher.Create` is accessed outside of the thread in which it was created. --- Sources/Common/DemandBuffer.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Sources/Common/DemandBuffer.swift b/Sources/Common/DemandBuffer.swift index 5df9743..be4fe16 100644 --- a/Sources/Common/DemandBuffer.swift +++ b/Sources/Common/DemandBuffer.swift @@ -44,6 +44,11 @@ class DemandBuffer { precondition(self.completion == nil, "How could a completed publisher sent values?! Beats me 🤷‍♂️") + lock.lock() + defer { + lock.unlock() + } + switch demandState.requested { case .unlimited: return subscriber.receive(value) From 25958f063c6b2d4de9f34085063bad40c8a59f94 Mon Sep 17 00:00:00 2001 From: Simon Jarbrant Date: Tue, 18 May 2021 08:09:37 +0200 Subject: [PATCH 2/2] Adjust formatting in DemandBuffer.swift Co-authored-by: Shai Mishali --- Sources/Common/DemandBuffer.swift | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Sources/Common/DemandBuffer.swift b/Sources/Common/DemandBuffer.swift index be4fe16..04be08a 100644 --- a/Sources/Common/DemandBuffer.swift +++ b/Sources/Common/DemandBuffer.swift @@ -43,11 +43,8 @@ class DemandBuffer { func buffer(value: S.Input) -> Subscribers.Demand { precondition(self.completion == nil, "How could a completed publisher sent values?! Beats me 🤷‍♂️") - lock.lock() - defer { - lock.unlock() - } + defer { lock.unlock() } switch demandState.requested { case .unlimited: