fix: bound aggregate FSSHTTP references

This commit is contained in:
2026-07-22 20:10:09 +02:00
parent 16eb996ad0
commit e44ff78511
3 changed files with 113 additions and 4 deletions

View File

@@ -19,6 +19,11 @@ import type {
FssHttpStreamHeader,
} from './types.js';
export interface FssHttpReferenceBudget {
readonly limit: number;
used: number;
}
export function readCompactU64(reader: BinaryReader): bigint {
const offset = reader.offset;
const first = reader.u8();
@@ -92,13 +97,16 @@ export function readFssHttpExGuid(reader: BinaryReader): ExGuid {
export function readFssHttpExGuidArray(
reader: BinaryReader,
limits: OneNoteParserLimits
limits: OneNoteParserLimits,
budget: FssHttpReferenceBudget
): ExGuid[] {
const countOffset = reader.offset;
const count = readCompactNumber(
reader,
limits.maxObjectReferences,
'Extended GUID array count'
);
reserveReferenceBudget(budget, count, countOffset);
const result: ExGuid[] = [];
for (let index = 0; index < count; index += 1) {
result.push(readFssHttpExGuid(reader));
@@ -115,13 +123,16 @@ export function readFssHttpCellId(reader: BinaryReader): FssHttpCellId {
export function readFssHttpCellIdArray(
reader: BinaryReader,
limits: OneNoteParserLimits
limits: OneNoteParserLimits,
budget: FssHttpReferenceBudget
): FssHttpCellId[] {
const countOffset = reader.offset;
const count = readCompactNumber(
reader,
limits.maxObjectReferences,
'Cell ID array count'
);
reserveReferenceBudget(budget, count, countOffset);
const result: FssHttpCellId[] = [];
for (let index = 0; index < count; index += 1) {
result.push(readFssHttpCellId(reader));
@@ -129,6 +140,21 @@ export function readFssHttpCellIdArray(
return result;
}
function reserveReferenceBudget(
budget: FssHttpReferenceBudget,
count: number,
offset: number
): void {
if (count > budget.limit - budget.used) {
throw new OneNoteParserError(
'LIMIT_EXCEEDED',
`FSSHTTPB object and cell reference count exceeds ${budget.limit}`,
{ offset, structure: 'FSSHTTPB object and cell references' }
);
}
budget.used += count;
}
export function readFssHttpSerialNumber(
reader: BinaryReader
): FssHttpSerialNumber {