Skip to content

Commit ebb15fb

Browse files
author
zhangwh
authored
Merge pull request #134 from alexyu1989/master
Can tolerate rescived publish message formatting errors.
2 parents 5c11ab7 + 46c59b5 commit ebb15fb

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

Source/CocoaMQTT.swift

+8-2
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,9 @@ class CocoaMQTTReader {
548548
delegate.didReceiveConnAck(self, connack: data[1])
549549
case .publish:
550550
let (msgid, message) = unpackPublish()
551-
delegate.didReceivePublish(self, message: message, id: msgid)
551+
if message != nil {
552+
delegate.didReceivePublish(self, message: message!, id: msgid)
553+
}
552554
case .puback:
553555
delegate.didReceivePubAck(self, msgid: msgid(data))
554556
case .pubrec:
@@ -570,9 +572,13 @@ class CocoaMQTTReader {
570572
readHeader()
571573
}
572574

573-
private func unpackPublish() -> (UInt16, CocoaMQTTMessage) {
575+
private func unpackPublish() -> (UInt16, CocoaMQTTMessage?) {
574576
let frame = CocoaMQTTFramePublish(header: header, data: data)
575577
frame.unpack()
578+
// if unpack fail
579+
if frame.msgid == nil {
580+
return (0, nil)
581+
}
576582
let msgid = frame.msgid!
577583
let qos = CocoaMQTTQOS(rawValue: frame.qos)!
578584
let message = CocoaMQTTMessage(topic: frame.topic!, payload: frame.payload, qos: qos, retained: frame.retained, dup: frame.dup)

Source/CocoaMQTTFrame.swift

+19-3
Original file line numberDiff line numberDiff line change
@@ -304,19 +304,35 @@ class CocoaMQTTFramePublish: CocoaMQTTFrame {
304304

305305
func unpack() {
306306
// topic
307+
data![1] = 10
308+
if data!.count < 2 {
309+
print("Invalid format of rescived message.")
310+
return
311+
}
307312
var msb = data![0]
308313
var lsb = data![1]
309314
let len = UInt16(msb) << 8 + UInt16(lsb)
310315
var pos = 2 + Int(len)
311-
topic = NSString(bytes: [UInt8](data![2...(pos-1)]), length: Int(len), encoding: String.Encoding.utf8.rawValue) as? String
316+
317+
if data!.count < pos {
318+
print("Invalid format of rescived message.")
319+
return
320+
}
321+
322+
topic = NSString(bytes: [UInt8](data![2...(pos-1)]), length: Int(len), encoding: String.Encoding.utf8.rawValue) as String?
312323

313324
// msgid
314325
if qos == 0 {
315326
msgid = 0
316327
} else {
317-
msb = data![pos]; lsb = data![pos+1]
318-
msgid = UInt16(msb) << 8 + UInt16(lsb)
328+
if data!.count < pos + 2 {
329+
print("Invalid format of rescived message.")
330+
return
331+
}
332+
msb = data![pos]
333+
lsb = data![pos+1]
319334
pos += 2
335+
msgid = UInt16(msb) << 8 + UInt16(lsb)
320336
}
321337

322338
// payload

0 commit comments

Comments
 (0)