emqx / CocoaMQTT

MQTT 5.0 client library for iOS and macOS written in Swift
https://www.emqx.com/en
Other
1.57k stars 411 forks source link

Crash caused by force unwrapping the reason code. #530

Open JyHu opened 1 year ago

JyHu commented 1 year ago

image

JyHu commented 1 year ago

* thread #1, queue = 'com.apple.main-thread', stop reason = Fatal error: Unexpectedly found nil while unwrapping an Optional value
    frame #0: 0x0000000195617ae8 libswiftCore.dylib`_swift_runtime_on_report
    frame #1: 0x00000001956b55d4 libswiftCore.dylib`_swift_stdlib_reportFatalErrorInFile + 208
    frame #2: 0x0000000195293fa0 libswiftCore.dylib`closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in Swift._assertionFailure(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 380
    frame #3: 0x0000000195293ce4 libswiftCore.dylib`closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in Swift._assertionFailure(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 200
    frame #4: 0x0000000195293adc libswiftCore.dylib`closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in Swift._assertionFailure(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 212
    frame #5: 0x000000019529363c libswiftCore.dylib`Swift._assertionFailure(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 236
  * frame #6: 0x000000010452b3b0 MQTT5Tests`CocoaMQTT5.didReceive(reader=0x000060000290c070, connack=CocoaMQTT.FrameConnAck @ 0x000000016fdfa418, self=0x0000000101b04310) at CocoaMQTT5.swift:756:64
    frame #7: 0x000000010452dfe4 MQTT5Tests`protocol witness for CocoaMQTTReaderDelegate.didReceive(_:connack:) in conformance CocoaMQTT5 at <compiler-generated>:0
    frame #8: 0x00000001045453a0 MQTT5Tests`CocoaMQTTReader.frameReady(self=0x000060000290c070) at CocoaMQTTReader.swift:125:23
    frame #9: 0x0000000104544bf8 MQTT5Tests`CocoaMQTTReader.payloadReady(data=3 bytes, self=0x000060000290c070) at CocoaMQTTReader.swift:93:9
    frame #10: 0x000000010452a0a0 MQTT5Tests`CocoaMQTT5.socket(socket=0x0000600001740440, data=3 bytes, tag=2, self=0x0000000101b04310) at CocoaMQTT5.swift:659:21
    frame #11: 0x000000010452a6e0 MQTT5Tests`protocol witness for CocoaMQTTSocketDelegate.socket(_:didRead:withTag:) in conformance CocoaMQTT5 at <compiler-generated>:0
    frame #12: 0x000000010454cc94 MQTT5Tests`CocoaMQTTSocket.socket(sock=0x0000000101b04200, data=3 bytes, tag=2, self=0x0000600001740440) at CocoaMQTTSocket.swift:129:19
    frame #13: 0x000000010454cd28 MQTT5Tests`@objc CocoaMQTTSocket.socket(_:didRead:withTag:) at <compiler-generated>:0
    frame #14: 0x00000001045a38a4 MQTT5Tests`__38-[MGCDAsyncSocket completeCurrentRead]_block_invoke(.block_descriptor=0x0000600001751400) at MGCDAsyncSocket.m:5770:4
    frame #15: 0x00000001873cd9dc libdispatch.dylib`_dispatch_call_block_and_release + 32
    frame #16: 0x00000001873cf504 libdispatch.dylib`_dispatch_client_callout + 20
    frame #17: 0x00000001873ddd1c libdispatch.dylib`_dispatch_main_queue_drain + 928
    frame #18: 0x00000001873dd96c libdispatch.dylib`_dispatch_main_queue_callback_4CF + 44
    frame #19: 0x0000000187676d6c CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16
    frame #20: 0x00000001876347ec CoreFoundation`__CFRunLoopRun + 2036
    frame #21: 0x00000001876338a4 CoreFoundation`CFRunLoopRunSpecific + 612
    frame #22: 0x00000001007fdb00 XCTestCore`-[XCTWaiter waitForExpectations:timeout:enforceOrder:] + 712
    frame #23: 0x00000001007d14a4 XCTestCore`-[XCTestCase(AsynchronousTesting) waitForExpectationsWithTimeout:handler:] + 184
    frame #24: 0x0000000104506150 MQTT5Tests`ConnectorTests.testExample(self=0x0000000101a12270) at ConnectorTests.swift:45:9
    frame #25: 0x0000000104506878 MQTT5Tests`@objc ConnectorTests.testExample() at <compiler-generated>:0
    frame #26: 0x0000000187617e04 CoreFoundation`__invoking___ + 148
    frame #27: 0x0000000187617c7c CoreFoundation`-[NSInvocation invoke] + 428
    frame #28: 0x0000000100822290 XCTestCore`+[XCTFailableInvocation invokeErrorConventionInvocation:completion:] + 96
    frame #29: 0x0000000100822228 XCTestCore`__90+[XCTFailableInvocation invokeInvocation:withTestMethodConvention:lastObservedErrorIssue:]_block_invoke + 28
    frame #30: 0x0000000100821df8 XCTestCore`__81+[XCTFailableInvocation invokeWithAsynchronousWait:lastObservedErrorIssue:block:]_block_invoke.5 + 112
    frame #31: 0x00000001007e15f8 XCTestCore`+[XCTSwiftErrorObservation observeErrorsInBlock:] + 84
    frame #32: 0x0000000100821c58 XCTestCore`+[XCTFailableInvocation invokeWithAsynchronousWait:lastObservedErrorIssue:block:] + 460
    frame #33: 0x00000001008221c4 XCTestCore`+[XCTFailableInvocation invokeInvocation:withTestMethodConvention:lastObservedErrorIssue:] + 372
    frame #34: 0x0000000100822540 XCTestCore`+[XCTFailableInvocation invokeInvocation:lastObservedErrorIssue:] + 72
    frame #35: 0x000000010081010c XCTestCore`__24-[XCTestCase invokeTest]_block_invoke_2 + 88
    frame #36: 0x00000001007ee828 XCTestCore`-[XCTMemoryChecker _assertInvalidObjectsDeallocatedAfterScope:] + 84
    frame #37: 0x0000000100819280 XCTestCore`-[XCTestCase assertInvalidObjectsDeallocatedAfterScope:] + 92
    frame #38: 0x000000010081008c XCTestCore`__24-[XCTestCase invokeTest]_block_invoke.98 + 172
    frame #39: 0x00000001007da1fc XCTestCore`-[XCTestCase(XCTIssueHandling) _caughtUnhandledDeveloperExceptionPermittingControlFlowInterruptions:caughtInterruptionException:whileExecutingBlock:] + 164
    frame #40: 0x000000010080fc28 XCTestCore`-[XCTestCase invokeTest] + 804
    frame #41: 0x0000000100811224 XCTestCore`__26-[XCTestCase performTest:]_block_invoke.155 + 36
    frame #42: 0x00000001007da1fc XCTestCore`-[XCTestCase(XCTIssueHandling) _caughtUnhandledDeveloperExceptionPermittingControlFlowInterruptions:caughtInterruptionException:whileExecutingBlock:] + 164
    frame #43: 0x0000000100810d78 XCTestCore`__26-[XCTestCase performTest:]_block_invoke.141 + 464
    frame #44: 0x00000001007f7cf8 XCTestCore`+[XCTContext _runInChildOfContext:forTestCase:markAsReportingBase:block:] + 180
    frame #45: 0x00000001007f7c0c XCTestCore`+[XCTContext runInContextForTestCase:markAsReportingBase:block:] + 144
    frame #46: 0x0000000100810a04 XCTestCore`-[XCTestCase performTest:] + 308
    frame #47: 0x00000001007c9260 XCTestCore`-[XCTest runTest] + 48
    frame #48: 0x00000001007fa8e0 XCTestCore`-[XCTestSuite runTestBasedOnRepetitionPolicy:testRun:] + 68
    frame #49: 0x00000001007fa7c0 XCTestCore`__27-[XCTestSuite performTest:]_block_invoke + 164
    frame #50: 0x00000001007fa270 XCTestCore`__59-[XCTestSuite _performProtectedSectionForTest:testSection:]_block_invoke + 48
    frame #51: 0x00000001007f7cf8 XCTestCore`+[XCTContext _runInChildOfContext:forTestCase:markAsReportingBase:block:] + 180
    frame #52: 0x00000001007f7c0c XCTestCore`+[XCTContext runInContextForTestCase:markAsReportingBase:block:] + 144
    frame #53: 0x00000001007fa20c XCTestCore`-[XCTestSuite _performProtectedSectionForTest:testSection:] + 180
    frame #54: 0x00000001007fa4c8 XCTestCore`-[XCTestSuite performTest:] + 216
    frame #55: 0x00000001007c9260 XCTestCore`-[XCTest runTest] + 48
    frame #56: 0x00000001007fa8e0 XCTestCore`-[XCTestSuite runTestBasedOnRepetitionPolicy:testRun:] + 68
    frame #57: 0x00000001007fa7c0 XCTestCore`__27-[XCTestSuite performTest:]_block_invoke + 164
    frame #58: 0x00000001007fa270 XCTestCore`__59-[XCTestSuite _performProtectedSectionForTest:testSection:]_block_invoke + 48
    frame #59: 0x00000001007f7cf8 XCTestCore`+[XCTContext _runInChildOfContext:forTestCase:markAsReportingBase:block:] + 180
    frame #60: 0x00000001007f7c0c XCTestCore`+[XCTContext runInContextForTestCase:markAsReportingBase:block:] + 144
    frame #61: 0x00000001007fa20c XCTestCore`-[XCTestSuite _performProtectedSectionForTest:testSection:] + 180
    frame #62: 0x00000001007fa4c8 XCTestCore`-[XCTestSuite performTest:] + 216
    frame #63: 0x00000001007c9260 XCTestCore`-[XCTest runTest] + 48
    frame #64: 0x00000001007fa8e0 XCTestCore`-[XCTestSuite runTestBasedOnRepetitionPolicy:testRun:] + 68
    frame #65: 0x00000001007fa7c0 XCTestCore`__27-[XCTestSuite performTest:]_block_invoke + 164
    frame #66: 0x00000001007fa270 XCTestCore`__59-[XCTestSuite _performProtectedSectionForTest:testSection:]_block_invoke + 48
    frame #67: 0x00000001007f7cf8 XCTestCore`+[XCTContext _runInChildOfContext:forTestCase:markAsReportingBase:block:] + 180
    frame #68: 0x00000001007f7c0c XCTestCore`+[XCTContext runInContextForTestCase:markAsReportingBase:block:] + 144
    frame #69: 0x00000001007fa20c XCTestCore`-[XCTestSuite _performProtectedSectionForTest:testSection:] + 180
    frame #70: 0x00000001007fa4c8 XCTestCore`-[XCTestSuite performTest:] + 216
    frame #71: 0x00000001007c9260 XCTestCore`-[XCTest runTest] + 48
    frame #72: 0x00000001007cad84 XCTestCore`__89-[XCTTestRunSession executeTestsWithIdentifiers:skippingTestsWithIdentifiers:completion:]_block_invoke + 104
    frame #73: 0x00000001007f7cf8 XCTestCore`+[XCTContext _runInChildOfContext:forTestCase:markAsReportingBase:block:] + 180
    frame #74: 0x00000001007f7c0c XCTestCore`+[XCTContext runInContextForTestCase:markAsReportingBase:block:] + 144
    frame #75: 0x00000001007cac78 XCTestCore`-[XCTTestRunSession executeTestsWithIdentifiers:skippingTestsWithIdentifiers:completion:] + 296
    frame #76: 0x000000010082ed54 XCTestCore`__72-[XCTExecutionWorker enqueueTestIdentifiersToRun:testIdentifiersToSkip:]_block_invoke_2 + 136
    frame #77: 0x000000010082eea4 XCTestCore`-[XCTExecutionWorker runWithError:] + 108
    frame #78: 0x00000001007f4f34 XCTestCore`__25-[XCTestDriver _runTests]_block_invoke.266 + 56
    frame #79: 0x00000001007d3454 XCTestCore`-[XCTestObservationCenter _observeTestExecutionForBlock:] + 288
    frame #80: 0x00000001007f4b90 XCTestCore`-[XCTestDriver _runTests] + 1092
    frame #81: 0x00000001007c9850 XCTestCore`_XCTestMain + 88
    frame #82: 0x0000000100005608 xctest`main + 192
    frame #83: 0x000000018722be50 dyld`start + 2544
JyHu commented 1 year ago

image

(lldb) p header
(UInt8) $R2 = 32
(lldb) p data
([UInt8]) $R3 = 3 values {
  [0] = 1
  [1] = 5
  [2] = 0
}

The second byte of the data is 5, and there is no matched enum case (CocoaMQTTCONNACKReasonCode) with this raw value.

The reason is that our backend development team mixed up the reason codes of MQTT3 and MQTT5. However, forcibly unwrapping in the framework may lead to crashes. Shouldn't we also add some conditional logic to handle this situation?

leeway1208 commented 1 year ago

Hello, Fixed and thanks for your support.

seasonZhu commented 1 year ago

This issue may happen in mqtt3ackļ¼ŒreturnCode is nil image