mirror of
https://github.com/google/flatbuffers.git
synced 2026-07-04 22:41:11 +00:00
Adds a way to verify/exposes Entities ids (#7221)
This commit is contained in:
@@ -400,10 +400,13 @@ public struct ByteBuffer {
|
||||
/// SkipPrefix Skips the first 4 bytes in case one of the following
|
||||
/// functions are called `getPrefixedSizeCheckedRoot` & `getPrefixedSizeRoot`
|
||||
/// which allows us to skip the first 4 bytes instead of recreating the buffer
|
||||
@discardableResult
|
||||
@usableFromInline
|
||||
mutating func skipPrefix() {
|
||||
mutating func skipPrefix() -> Int32 {
|
||||
_writerSize = _writerSize &- MemoryLayout<Int32>.size
|
||||
return read(def: Int32.self, position: 0)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension ByteBuffer: CustomDebugStringConvertible {
|
||||
|
||||
@@ -19,6 +19,10 @@ import Foundation
|
||||
/// Collection of thrown from the Flatbuffer verifier
|
||||
public enum FlatbuffersErrors: Error, Equatable {
|
||||
|
||||
/// Thrown when verifying a file id that doesnt match buffer id
|
||||
case bufferIdDidntMatchPassedId
|
||||
/// Prefixed size doesnt match the current (readable) buffer size
|
||||
case prefixedSizeNotEqualToBufferSize
|
||||
/// Thrown when buffer is bigger than the allowed 2GiB
|
||||
case exceedsMaxSizeAllowed
|
||||
/// Thrown when there is an missaligned pointer at position
|
||||
|
||||
@@ -28,10 +28,39 @@ import Foundation
|
||||
/// the ``ByteBuffer`` and verifies the buffer by calling ``getCheckedRoot(byteBuffer:options:)``
|
||||
public func getPrefixedSizeCheckedRoot<T: FlatBufferObject & Verifiable>(
|
||||
byteBuffer: inout ByteBuffer,
|
||||
fileId: String? = nil,
|
||||
options: VerifierOptions = .init()) throws -> T
|
||||
{
|
||||
byteBuffer.skipPrefix()
|
||||
return try getCheckedRoot(byteBuffer: &byteBuffer, options: options)
|
||||
return try getCheckedRoot(
|
||||
byteBuffer: &byteBuffer,
|
||||
fileId: fileId,
|
||||
options: options)
|
||||
}
|
||||
|
||||
/// Takes in a prefixed sized buffer, where we check if the sized buffer is equal to prefix size.
|
||||
/// And would verify that the buffer passed is a valid `Flatbuffers` Object.
|
||||
/// - Parameters:
|
||||
/// - byteBuffer: Buffer that needs to be checked and read
|
||||
/// - options: Verifier options
|
||||
/// - Throws: FlatbuffersErrors
|
||||
/// - Returns: Returns a valid, checked Flatbuffers object
|
||||
///
|
||||
/// ``getPrefixedSizeCheckedRoot(byteBuffer:options:)`` would skip the first Bytes in
|
||||
/// the ``ByteBuffer`` and verifies the buffer by calling ``getCheckedRoot(byteBuffer:options:)``
|
||||
public func getCheckedPrefixedSizeRoot<T: FlatBufferObject & Verifiable>(
|
||||
byteBuffer: inout ByteBuffer,
|
||||
fileId: String? = nil,
|
||||
options: VerifierOptions = .init()) throws -> T
|
||||
{
|
||||
let prefix = byteBuffer.skipPrefix()
|
||||
if prefix != byteBuffer.size {
|
||||
throw FlatbuffersErrors.prefixedSizeNotEqualToBufferSize
|
||||
}
|
||||
return try getCheckedRoot(
|
||||
byteBuffer: &byteBuffer,
|
||||
fileId: fileId,
|
||||
options: options)
|
||||
}
|
||||
|
||||
/// Takes in a prefixed sized buffer, where the prefixed size would be skipped.
|
||||
@@ -61,9 +90,13 @@ public func getPrefixedSizeRoot<T: FlatBufferObject>(byteBuffer: inout ByteBuffe
|
||||
/// and within the ``ByteBuffer`` range.
|
||||
public func getCheckedRoot<T: FlatBufferObject & Verifiable>(
|
||||
byteBuffer: inout ByteBuffer,
|
||||
fileId: String? = nil,
|
||||
options: VerifierOptions = .init()) throws -> T
|
||||
{
|
||||
var verifier = try Verifier(buffer: &byteBuffer, options: options)
|
||||
if let fileId = fileId {
|
||||
try verifier.verify(id: fileId)
|
||||
}
|
||||
try ForwardOffset<T>.verify(&verifier, at: 0, of: T.self)
|
||||
return T.init(
|
||||
byteBuffer,
|
||||
|
||||
@@ -200,4 +200,14 @@ public struct Verifier {
|
||||
internal mutating func finish() {
|
||||
_depth -= 1
|
||||
}
|
||||
|
||||
mutating func verify(id: String) throws {
|
||||
let size = MemoryLayout<Int32>.size
|
||||
let str = _buffer.readString(at: size, count: size)
|
||||
if id == str {
|
||||
return
|
||||
}
|
||||
throw FlatbuffersErrors.bufferIdDidntMatchPassedId
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user