Skip to content

Commit a0e1126

Browse files
authored
Fix re-entrancy issue with MQTTListeners.notify (#131)
* Copy listener array when inside lock process copied listener array outside lock * Remove commented out code
1 parent b4fab62 commit a0e1126

File tree

2 files changed

+12
-9
lines changed

2 files changed

+12
-9
lines changed

Sources/MQTTNIO/MQTTClient.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,9 @@ public final class MQTTClient {
411411
}
412412

413413
var connectionParameters = ConnectionParameters()
414-
var publishListeners = MQTTListeners<MQTTPublishInfo>()
415-
var closeListeners = MQTTListeners<Void>()
416-
var shutdownListeners = MQTTListeners<Void>()
414+
let publishListeners = MQTTListeners<MQTTPublishInfo>()
415+
let closeListeners = MQTTListeners<Void>()
416+
let shutdownListeners = MQTTListeners<Void>()
417417
private var _connection: MQTTConnection?
418418
private var lock = NIOLock()
419419
}

Sources/MQTTNIO/MQTTListeners.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@
1414
import NIO
1515
import NIOConcurrencyHelpers
1616

17-
class MQTTListeners<ReturnType> {
17+
final class MQTTListeners<ReturnType> {
1818
typealias Listener = (Result<ReturnType, Error>) -> Void
1919

2020
func notify(_ result: Result<ReturnType, Error>) {
21-
self.lock.withLock {
22-
listeners.values.forEach { listener in
23-
listener(result)
24-
}
21+
let listeners = self.lock.withLock {
22+
return self.listeners
23+
}
24+
listeners.values.forEach { listener in
25+
listener(result)
2526
}
2627
}
2728

@@ -38,7 +39,9 @@ class MQTTListeners<ReturnType> {
3839
}
3940

4041
func removeAll() {
41-
self.listeners = [:]
42+
self.lock.withLock {
43+
self.listeners = [:]
44+
}
4245
}
4346

4447
private let lock = NIOLock()

0 commit comments

Comments
 (0)