mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Defensive Coding
This commit is contained in:
parent
21fbe0d033
commit
fd07f15edc
@ -727,27 +727,57 @@ public final class PostboxDecoder {
|
|||||||
case .Double:
|
case .Double:
|
||||||
offset += 8
|
offset += 8
|
||||||
case .String:
|
case .String:
|
||||||
var length: Int32 = 0
|
if offset + 4 > length {
|
||||||
memcpy(&length, bytes + offset, 4)
|
offset = 0
|
||||||
offset += 4 + Int(length)
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var valueLength: Int32 = 0
|
||||||
|
memcpy(&valueLength, bytes + offset, 4)
|
||||||
|
offset += 4 + Int(valueLength)
|
||||||
case .Object:
|
case .Object:
|
||||||
var length: Int32 = 0
|
if offset + 4 > length {
|
||||||
memcpy(&length, bytes + (offset + 4), 4)
|
offset = 0
|
||||||
offset += 8 + Int(length)
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var valueLength: Int32 = 0
|
||||||
|
memcpy(&valueLength, bytes + (offset + 4), 4)
|
||||||
|
offset += 8 + Int(valueLength)
|
||||||
case .Int32Array:
|
case .Int32Array:
|
||||||
var length: Int32 = 0
|
if offset + 4 > length {
|
||||||
memcpy(&length, bytes + offset, 4)
|
offset = 0
|
||||||
offset += 4 + Int(length) * 4
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var valueLength: Int32 = 0
|
||||||
|
memcpy(&valueLength, bytes + offset, 4)
|
||||||
|
offset += 4 + Int(valueLength) * 4
|
||||||
case .Int64Array:
|
case .Int64Array:
|
||||||
var length: Int32 = 0
|
if offset + 4 > length {
|
||||||
memcpy(&length, bytes + offset, 4)
|
offset = 0
|
||||||
offset += 4 + Int(length) * 8
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var valueLength: Int32 = 0
|
||||||
|
memcpy(&valueLength, bytes + offset, 4)
|
||||||
|
offset += 4 + Int(valueLength) * 8
|
||||||
case .ObjectArray:
|
case .ObjectArray:
|
||||||
|
if offset + 4 > length {
|
||||||
|
offset = 0
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
var subLength: Int32 = 0
|
var subLength: Int32 = 0
|
||||||
memcpy(&subLength, bytes + offset, 4)
|
memcpy(&subLength, bytes + offset, 4)
|
||||||
offset += 4
|
offset += 4
|
||||||
var i: Int32 = 0
|
var i: Int32 = 0
|
||||||
while i < subLength {
|
while i < subLength {
|
||||||
|
if offset + 4 + 4 > length {
|
||||||
|
offset = 0
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
var objectLength: Int32 = 0
|
var objectLength: Int32 = 0
|
||||||
memcpy(&objectLength, bytes + (offset + 4), 4)
|
memcpy(&objectLength, bytes + (offset + 4), 4)
|
||||||
offset += 8 + Int(objectLength)
|
offset += 8 + Int(objectLength)
|
||||||
@ -759,32 +789,62 @@ public final class PostboxDecoder {
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
case .ObjectDictionary:
|
case .ObjectDictionary:
|
||||||
var length: Int32 = 0
|
if offset + 4 > length {
|
||||||
memcpy(&length, bytes + offset, 4)
|
offset = 0
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var valueLength: Int32 = 0
|
||||||
|
memcpy(&valueLength, bytes + offset, 4)
|
||||||
offset += 4
|
offset += 4
|
||||||
var i: Int32 = 0
|
var i: Int32 = 0
|
||||||
while i < length {
|
while i < valueLength {
|
||||||
|
if offset + 4 + 4 > length {
|
||||||
|
offset = 0
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
var keyLength: Int32 = 0
|
var keyLength: Int32 = 0
|
||||||
memcpy(&keyLength, bytes + (offset + 4), 4)
|
memcpy(&keyLength, bytes + (offset + 4), 4)
|
||||||
offset += 8 + Int(keyLength)
|
offset += 8 + Int(keyLength)
|
||||||
|
|
||||||
|
if offset + 4 + 4 > length {
|
||||||
|
offset = 0
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
var valueLength: Int32 = 0
|
var valueLength: Int32 = 0
|
||||||
memcpy(&valueLength, bytes + (offset + 4), 4)
|
memcpy(&valueLength, bytes + (offset + 4), 4)
|
||||||
offset += 8 + Int(valueLength)
|
offset += 8 + Int(valueLength)
|
||||||
i += 1
|
i += 1
|
||||||
}
|
}
|
||||||
case .Bytes:
|
case .Bytes:
|
||||||
var length: Int32 = 0
|
if offset + 4 > length {
|
||||||
memcpy(&length, bytes + offset, 4)
|
offset = 0
|
||||||
offset += 4 + Int(length)
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var valueLength: Int32 = 0
|
||||||
|
memcpy(&valueLength, bytes + offset, 4)
|
||||||
|
offset += 4 + Int(valueLength)
|
||||||
case .Nil:
|
case .Nil:
|
||||||
break
|
break
|
||||||
case .StringArray, .BytesArray:
|
case .StringArray, .BytesArray:
|
||||||
var length: Int32 = 0
|
if offset + 4 > length {
|
||||||
memcpy(&length, bytes + offset, 4)
|
offset = 0
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var valueLength: Int32 = 0
|
||||||
|
memcpy(&valueLength, bytes + offset, 4)
|
||||||
offset += 4
|
offset += 4
|
||||||
var i: Int32 = 0
|
var i: Int32 = 0
|
||||||
while i < length {
|
while i < length {
|
||||||
|
if offset + 4 > length {
|
||||||
|
offset = 0
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
var stringLength: Int32 = 0
|
var stringLength: Int32 = 0
|
||||||
memcpy(&stringLength, bytes + offset, 4)
|
memcpy(&stringLength, bytes + offset, 4)
|
||||||
offset += 4 + Int(stringLength)
|
offset += 4 + Int(stringLength)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user