Defensive Coding

This commit is contained in:
Ali 2023-02-22 20:58:08 +04:00
parent 21fbe0d033
commit fd07f15edc

View File

@ -727,27 +727,57 @@ public final class PostboxDecoder {
case .Double:
offset += 8
case .String:
var length: Int32 = 0
memcpy(&length, bytes + offset, 4)
offset += 4 + Int(length)
if offset + 4 > length {
offset = 0
return false
}
var valueLength: Int32 = 0
memcpy(&valueLength, bytes + offset, 4)
offset += 4 + Int(valueLength)
case .Object:
var length: Int32 = 0
memcpy(&length, bytes + (offset + 4), 4)
offset += 8 + Int(length)
if offset + 4 > length {
offset = 0
return false
}
var valueLength: Int32 = 0
memcpy(&valueLength, bytes + (offset + 4), 4)
offset += 8 + Int(valueLength)
case .Int32Array:
var length: Int32 = 0
memcpy(&length, bytes + offset, 4)
offset += 4 + Int(length) * 4
if offset + 4 > length {
offset = 0
return false
}
var valueLength: Int32 = 0
memcpy(&valueLength, bytes + offset, 4)
offset += 4 + Int(valueLength) * 4
case .Int64Array:
var length: Int32 = 0
memcpy(&length, bytes + offset, 4)
offset += 4 + Int(length) * 8
if offset + 4 > length {
offset = 0
return false
}
var valueLength: Int32 = 0
memcpy(&valueLength, bytes + offset, 4)
offset += 4 + Int(valueLength) * 8
case .ObjectArray:
if offset + 4 > length {
offset = 0
return false
}
var subLength: Int32 = 0
memcpy(&subLength, bytes + offset, 4)
offset += 4
var i: Int32 = 0
while i < subLength {
if offset + 4 + 4 > length {
offset = 0
return false
}
var objectLength: Int32 = 0
memcpy(&objectLength, bytes + (offset + 4), 4)
offset += 8 + Int(objectLength)
@ -759,32 +789,62 @@ public final class PostboxDecoder {
}
return true
case .ObjectDictionary:
var length: Int32 = 0
memcpy(&length, bytes + offset, 4)
if offset + 4 > length {
offset = 0
return false
}
var valueLength: Int32 = 0
memcpy(&valueLength, bytes + offset, 4)
offset += 4
var i: Int32 = 0
while i < length {
while i < valueLength {
if offset + 4 + 4 > length {
offset = 0
return false
}
var keyLength: Int32 = 0
memcpy(&keyLength, bytes + (offset + 4), 4)
offset += 8 + Int(keyLength)
if offset + 4 + 4 > length {
offset = 0
return false
}
var valueLength: Int32 = 0
memcpy(&valueLength, bytes + (offset + 4), 4)
offset += 8 + Int(valueLength)
i += 1
}
case .Bytes:
var length: Int32 = 0
memcpy(&length, bytes + offset, 4)
offset += 4 + Int(length)
if offset + 4 > length {
offset = 0
return false
}
var valueLength: Int32 = 0
memcpy(&valueLength, bytes + offset, 4)
offset += 4 + Int(valueLength)
case .Nil:
break
case .StringArray, .BytesArray:
var length: Int32 = 0
memcpy(&length, bytes + offset, 4)
if offset + 4 > length {
offset = 0
return false
}
var valueLength: Int32 = 0
memcpy(&valueLength, bytes + offset, 4)
offset += 4
var i: Int32 = 0
while i < length {
if offset + 4 > length {
offset = 0
return false
}
var stringLength: Int32 = 0
memcpy(&stringLength, bytes + offset, 4)
offset += 4 + Int(stringLength)