Skip to content

Commit 21306f3

Browse files
Arm backend: Validate bounds when reading Vela binary blocks (#23996)
Reject invalid inputs and truncated headers or padded payloads before advancing through the Vela stream. Track remaining bytes to avoid out-of-bounds reads and arithmetic overflow from malformed block sizes. Signed-off-by: Sebastian Larsson <sebastian.larsson@arm.com>
1 parent 0a7ef9c commit 21306f3

1 file changed

Lines changed: 21 additions & 3 deletions

File tree

‎backends/arm/runtime/VelaBinStream.cpp‎

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,29 @@ Error vela_bin_read(
101101
int size,
102102
const NamedDataMap* named_data_map,
103103
VelaHandles* handles) {
104+
if (data == nullptr || handles == nullptr || size <= 0) {
105+
return Error::InvalidProgram;
106+
}
107+
104108
const char* ptr = data;
109+
size_t remaining = static_cast<size_t>(size);
105110

106-
while (ptr - data < size) {
111+
while (remaining > 0) {
112+
if (remaining < sizeof(VelaBinBlock)) {
113+
return Error::InvalidProgram;
114+
}
107115
VelaBinBlock* b = reinterpret_cast<VelaBinBlock*>(const_cast<char*>(ptr));
108-
ptr += sizeof(VelaBinBlock) + next_mul_16(b->size);
116+
const size_t available_payload_size = remaining - sizeof(VelaBinBlock);
117+
if (b->size > available_payload_size) {
118+
return Error::InvalidProgram;
119+
}
120+
const size_t payload_size = next_mul_16(b->size);
121+
if (payload_size > available_payload_size) {
122+
return Error::InvalidProgram;
123+
}
124+
const size_t block_size = sizeof(VelaBinBlock) + payload_size;
125+
ptr += block_size;
126+
remaining -= block_size;
109127

110128
VelaBlockPayload payload{b->data, b->size};
111129
if (b->external == kVelaExternalBlockReference) {
@@ -160,7 +178,7 @@ Error vela_bin_read(
160178
} else if (!strncmp(
161179
b->name, "vela_end_stream", strlen("vela_end_stream"))) {
162180
// expect vela_end_stream last
163-
if (ptr - data != size) {
181+
if (remaining != 0) {
164182
ET_LOG(Error, "Expected vela binary to end with vela_end_stream");
165183
return Error::InvalidProgram;
166184
}

0 commit comments

Comments
 (0)