Skip to content

Commit cbc657b

Browse files
committed
sdk: reject corrupted and truncated timestamp index data
Error on next_entry_index > MAX in Python/TS (Go already did this). Error on truncated entry data in all three SDKs instead of silently returning partial or zero-value entries.
1 parent 7c79d68 commit cbc657b

3 files changed

Lines changed: 29 additions & 8 deletions

File tree

sdk/telemetry/go/state.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,12 @@ func DeserializeTimestampIndex(data []byte) (*TimestampIndex, error) {
173173
return nil, fmt.Errorf("next_entry_index %d exceeds max %d", count, MaxTimestampIndexEntries)
174174
}
175175

176+
if r.Remaining() < count*timestampIndexEntrySize {
177+
return nil, fmt.Errorf("data too short for %d timestamp index entries: %d < %d", count, r.Remaining(), count*timestampIndexEntrySize)
178+
}
179+
176180
d.Entries = make([]TimestampIndexEntry, count)
177181
for i := range count {
178-
if r.Remaining() < timestampIndexEntrySize {
179-
break
180-
}
181182
d.Entries[i].SampleIndex, _ = r.ReadU32()
182183
d.Entries[i].TimestampMicroseconds, _ = r.ReadU64()
183184
}

sdk/telemetry/python/telemetry/state.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,20 @@ def from_bytes(cls, data: bytes) -> TimestampIndex:
172172

173173
r.read_bytes(64) # reserved
174174

175-
count = min(next_entry_index, MAX_TIMESTAMP_INDEX_ENTRIES)
175+
if next_entry_index > MAX_TIMESTAMP_INDEX_ENTRIES:
176+
raise ValueError(
177+
f"next_entry_index {next_entry_index} exceeds max {MAX_TIMESTAMP_INDEX_ENTRIES}"
178+
)
179+
180+
count = next_entry_index
181+
if r.remaining < count * TIMESTAMP_INDEX_ENTRY_SIZE:
182+
raise ValueError(
183+
f"data too short for {count} timestamp index entries: "
184+
f"{r.remaining} < {count * TIMESTAMP_INDEX_ENTRY_SIZE}"
185+
)
186+
176187
entries: list[TimestampIndexEntry] = []
177188
for _ in range(count):
178-
if r.remaining < TIMESTAMP_INDEX_ENTRY_SIZE:
179-
break
180189
sample_index = r.read_u32()
181190
timestamp_microseconds = r.read_u64()
182191
entries.append(TimestampIndexEntry(sample_index, timestamp_microseconds))

sdk/telemetry/typescript/telemetry/state.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,21 @@ export function deserializeTimestampIndex(
161161

162162
r.readBytes(64); // _unused
163163

164-
const count = Math.min(nextEntryIndex, MAX_TIMESTAMP_INDEX_ENTRIES);
164+
if (nextEntryIndex > MAX_TIMESTAMP_INDEX_ENTRIES) {
165+
throw new Error(
166+
`next_entry_index ${nextEntryIndex} exceeds max ${MAX_TIMESTAMP_INDEX_ENTRIES}`,
167+
);
168+
}
169+
170+
const count = nextEntryIndex;
171+
if (r.remaining < count * TIMESTAMP_INDEX_ENTRY_SIZE) {
172+
throw new Error(
173+
`data too short for ${count} timestamp index entries: ${r.remaining} < ${count * TIMESTAMP_INDEX_ENTRY_SIZE}`,
174+
);
175+
}
176+
165177
const entries: TimestampIndexEntry[] = [];
166178
for (let i = 0; i < count; i++) {
167-
if (r.remaining < TIMESTAMP_INDEX_ENTRY_SIZE) break;
168179
entries.push({
169180
sampleIndex: r.readU32(),
170181
timestampMicroseconds: r.readU64(),

0 commit comments

Comments
 (0)