@ifc-lite/cache 3.0.3 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,6 +31,11 @@ import { BufferReader } from '../utils/buffer-utils.js';
31
31
  import { type GeometryChunkInfo } from '../types.js';
32
32
  /** Parsed head of a v13 geometry section. */
33
33
  export interface GeometryHead {
34
+ /** Byte length of the head that FOLLOWS the `headLength` field itself. The
35
+ * first chunk record therefore starts at `4 + headLength`, which is the
36
+ * only external anchor available for chunk 0's declared offset — a
37
+ * consistent-with-predecessor loop cannot anchor element 0. */
38
+ headLength: number;
34
39
  meshCount: number;
35
40
  totalVertices: number;
36
41
  totalTriangles: number;
@@ -1 +1 @@
1
- {"version":3,"file":"geometry-chunks.d.ts","sourceRoot":"","sources":["../../src/sections/geometry-chunks.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAgB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAarB,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAYD,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,KAAG,OAAO,CAAC,UAAU,CACP,CAAC;AAE1D,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,KAAG,OAAO,CAAC,UAAU,CACL,CAAC;AAwB5D,+EAA+E;AAC/E,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,QAAQ,EAAE,EAClB,SAAS,GAAE,MAAkC,GAC5C,QAAQ,EAAE,EAAE,CAsBd;AAqBD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,QAAQ,EAAE,EAClB,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,OAAO,CAAC,WAAW,CAAC,CAgFtB;AAID;yDACyD;AACzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAqBtE;AAED,0DAA0D;AAC1D,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,EAAE,CAAC,CAerB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,YAAY,GAAG;IAAE,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;CAAE,CAclE;AAED,mFAAmF;AACnF,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,cAAc,CAAA;CAAE,CAAC,CAYhH"}
1
+ {"version":3,"file":"geometry-chunks.d.ts","sourceRoot":"","sources":["../../src/sections/geometry-chunks.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAgB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAcrB,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B;;;oEAGgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAYD,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,KAAG,OAAO,CAAC,UAAU,CACP,CAAC;AAE1D,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,KAAG,OAAO,CAAC,UAAU,CACL,CAAC;AAwB5D,+EAA+E;AAC/E,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,QAAQ,EAAE,EAClB,SAAS,GAAE,MAAkC,GAC5C,QAAQ,EAAE,EAAE,CAsBd;AAqBD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,QAAQ,EAAE,EAClB,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,OAAO,CAAC,WAAW,CAAC,CAgFtB;AAID;yDACyD;AACzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAoBtE;AAED,0DAA0D;AAC1D,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,EAAE,CAAC,CA4BrB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,YAAY,GAAG;IAAE,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;CAAE,CAmClE;AAED,mFAAmF;AACnF,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,cAAc,CAAA;CAAE,CAAC,CAYhH"}
@@ -4,6 +4,7 @@
4
4
  import { BufferWriter, BufferReader } from '../utils/buffer-utils.js';
5
5
  import { GEOMETRY_CHUNK_CELL_SIZE, GEOMETRY_CHUNK_SOFT_BYTES, GEOMETRY_CHUNK_COMPRESS_MIN_BYTES, GeometryChunkFlags, } from '../types.js';
6
6
  import { validateMeshes, writeMeshRecord, readMeshRecord, meshRecordByteLength, writeCoordinateInfo, readCoordinateInfo, } from './geometry.js';
7
+ import { validateGeometryDirectory } from './geometry-directory.js';
7
8
  // 6×f32 AABB (24) + 5×u32 (offset, length, uncompressed, meshCount, flags).
8
9
  const DIRECTORY_ENTRY_BYTES = 44;
9
10
  // ─── codec ────────────────────────────────────────────────────────────────
@@ -169,7 +170,6 @@ export async function buildGeometrySectionV13(meshes, coordinateInfo, options =
169
170
  * section start. Cheap: never touches chunk records. */
170
171
  export function readGeometryHeadV13(reader) {
171
172
  const headLength = reader.readUint32();
172
- void headLength; // total head size — used by range readers to bound the head fetch
173
173
  const meshCount = reader.readUint32();
174
174
  const totalVertices = reader.readUint32();
175
175
  const totalTriangles = reader.readUint32();
@@ -187,7 +187,7 @@ export function readGeometryHeadV13(reader) {
187
187
  flags: reader.readUint32(),
188
188
  });
189
189
  }
190
- return { meshCount, totalVertices, totalTriangles, coordinateInfo, chunks };
190
+ return { headLength, meshCount, totalVertices, totalTriangles, coordinateInfo, chunks };
191
191
  }
192
192
  /** Decode one chunk record's stored bytes into meshes. */
193
193
  export async function decodeGeometryChunk(stored, info, version) {
@@ -204,6 +204,17 @@ export async function decodeGeometryChunk(stored, info, version) {
204
204
  for (let i = 0; i < info.meshCount; i++) {
205
205
  meshes.push(readMeshRecord(reader, version, i));
206
206
  }
207
+ // `meshCount` and `uncompressedLength` are two independently-corruptible
208
+ // directory fields; a lying pair (meshCount inflated, uncompressedLength
209
+ // adjusted to match a byteLength that swallowed a NEIGHBOURING chunk's
210
+ // bytes — see readChunk's bounds check) would otherwise let this loop
211
+ // silently decode the next chunk's real mesh records as if they belonged
212
+ // to this one, duplicating that geometry under two chunks with no error.
213
+ // Requiring the reader to land exactly on `raw`'s end closes that: valid
214
+ // records always consume the whole (decompressed) chunk record exactly.
215
+ if (reader.position !== raw.byteLength) {
216
+ throw new Error(`Invalid cache: chunk claims ${info.meshCount} mesh record(s) but consumed ${reader.position} of ${raw.byteLength} bytes`);
217
+ }
207
218
  return meshes;
208
219
  }
209
220
  /**
@@ -217,7 +228,15 @@ export function openGeometryChunksV13(buffer, sectionOffset, version) {
217
228
  const reader = new BufferReader(buffer);
218
229
  reader.position = sectionOffset;
219
230
  const head = readGeometryHeadV13(reader);
231
+ // `reader.position` here is a STRUCTURAL fact: it's where the parse of
232
+ // meshCount/totalVertices/totalTriangles/coordinateInfo/chunkCount/
233
+ // directory actually landed, none of which depend on `head.headLength`.
234
+ // `head.headLength` itself is just an on-disk declared field, read but
235
+ // never used to seek — so it can disagree with the true head size without
236
+ // the parse above ever noticing.
237
+ const actualHeadEnd = reader.position - sectionOffset;
220
238
  const bytes = new Uint8Array(buffer);
239
+ validateGeometryDirectory(head, actualHeadEnd);
221
240
  return {
222
241
  ...head,
223
242
  readChunk(index) {
@@ -225,7 +244,16 @@ export function openGeometryChunksV13(buffer, sectionOffset, version) {
225
244
  if (!info)
226
245
  return Promise.reject(new Error(`chunk index ${index} out of range (${head.chunks.length})`));
227
246
  const start = sectionOffset + info.byteOffset;
228
- return decodeGeometryChunk(bytes.subarray(start, start + info.byteLength), info, version);
247
+ const end = start + info.byteLength;
248
+ // `Uint8Array.subarray` SATURATES instead of throwing when a range
249
+ // runs past the buffer, so a corrupt/truncated directory entry would
250
+ // otherwise silently hand `decodeGeometryChunk` fewer bytes than
251
+ // declared instead of failing loudly — the same shape as the
252
+ // packed-geometry pool and LAS strided-read bugs.
253
+ if (end > bytes.length) {
254
+ return Promise.reject(new Error(`Invalid cache: geometry chunk ${index} range [${start}, ${end}) exceeds buffer length ${bytes.length}`));
255
+ }
256
+ return decodeGeometryChunk(bytes.subarray(start, end), info, version);
229
257
  },
230
258
  };
231
259
  }
@@ -1 +1 @@
1
- {"version":3,"file":"geometry-chunks.js","sourceRoot":"","sources":["../../src/sections/geometry-chunks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"geometry-chunks.js","sourceRoot":"","sources":["../../src/sections/geometry-chunks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Validation for the v13 geometry section's chunk directory (see the module
3
+ * doc comment in geometry-chunks.ts for the on-disk layout). Split out of
4
+ * geometry-chunks.ts so the directory-integrity checks — which exist purely
5
+ * to catch corrupted/adversarial cache files, not to serve the happy path —
6
+ * stay reviewable on their own.
7
+ */
8
+ import type { GeometryHead } from './geometry-chunks.js';
9
+ /**
10
+ * Validate a parsed v13 geometry head's directory against the structural
11
+ * facts of the parse. `actualHeadEnd` is where the head parse actually
12
+ * landed (relative to the section start) — a fact independent of anything
13
+ * the on-disk `headLength` field claims. Throws on any inconsistency.
14
+ */
15
+ export declare function validateGeometryDirectory(head: GeometryHead, actualHeadEnd: number): void;
16
+ //# sourceMappingURL=geometry-directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry-directory.d.ts","sourceRoot":"","sources":["../../src/sections/geometry-directory.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAyDzF"}
@@ -0,0 +1,61 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Validate a parsed v13 geometry head's directory against the structural
6
+ * facts of the parse. `actualHeadEnd` is where the head parse actually
7
+ * landed (relative to the section start) — a fact independent of anything
8
+ * the on-disk `headLength` field claims. Throws on any inconsistency.
9
+ */
10
+ export function validateGeometryDirectory(head, actualHeadEnd) {
11
+ // Validate `headLength` against that structural fact BEFORE it is trusted
12
+ // as the chunk-0 anchor below. Without this, the anchor check further down
13
+ // (`chunks[0].byteOffset === 4 + head.headLength`) only cross-validates two
14
+ // independently-corruptible on-disk fields against EACH OTHER: corrupt
15
+ // headLength and echo the same corruption into chunk 0's declared
16
+ // byteOffset, and the two stay "consistent" while both disagree with where
17
+ // the head parse actually ended — stepping around the anchor check AND the
18
+ // contiguity loop that follows it in one move. Anchoring against
19
+ // `reader.position` instead closes that, because it can't be forged from
20
+ // inside the buffer's declared fields.
21
+ if (4 + head.headLength !== actualHeadEnd) {
22
+ throw new Error(`Invalid cache: geometry head declares headLength ${head.headLength}, but the parsed head is ${actualHeadEnd - 4} bytes`);
23
+ }
24
+ // The writer lays chunks out back-to-back with no gaps (see the module
25
+ // doc comment). Validate that invariant on read: a corrupt directory entry
26
+ // that inflates one chunk's byteLength (with uncompressedLength and
27
+ // meshCount lied to match, so the per-chunk checks in decodeGeometryChunk
28
+ // can't tell) would otherwise let that chunk's slice reach into — and
29
+ // silently absorb — a NEIGHBOURING chunk's real, validly-encoded mesh
30
+ // records, duplicating that geometry under two chunks with no error. This
31
+ // catches it at the structural level, independent of anything the
32
+ // corrupted entry itself claims.
33
+ // NOTE: this only cross-checks chunks against EACH OTHER (safe regardless
34
+ // of what follows the geometry section in a multi-section cache file). It
35
+ // does not — and structurally cannot, without also threading the
36
+ // section's own byte size through this call — catch a corrupted LAST
37
+ // chunk whose declared range reaches past its true end into whatever
38
+ // bytes happen to follow (trailing padding, or the next section). That
39
+ // residual case still relies on readChunk's own end-of-buffer bounds
40
+ // check plus decodeGeometryChunk's uncompressedLength check.
41
+ // Anchor the sequence. The contiguity loop below starts at i = 1 because
42
+ // element 0 has no predecessor to be consistent WITH -- so on its own it
43
+ // validates every chunk except the first, and a directory whose offsets are
44
+ // all shifted by the same amount stays perfectly contiguous and passes.
45
+ // `headLength` is that external anchor: the writer lays the first chunk
46
+ // immediately after the head, at `4 + headLength` (the 4 being the
47
+ // `headLength` field itself).
48
+ if (head.chunks.length > 0) {
49
+ const expectedFirst = actualHeadEnd; // == 4 + head.headLength, now proven equal above
50
+ if (head.chunks[0].byteOffset !== expectedFirst) {
51
+ throw new Error(`Invalid cache: geometry chunk 0 byteOffset ${head.chunks[0].byteOffset} does not start at the end of the head (expected ${expectedFirst})`);
52
+ }
53
+ }
54
+ for (let i = 1; i < head.chunks.length; i++) {
55
+ const expectedStart = head.chunks[i - 1].byteOffset + head.chunks[i - 1].byteLength;
56
+ if (head.chunks[i].byteOffset !== expectedStart) {
57
+ throw new Error(`Invalid cache: geometry chunk ${i} byteOffset ${head.chunks[i].byteOffset} is not contiguous with the previous chunk (expected ${expectedStart})`);
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=geometry-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry-directory.js","sourceRoot":"","sources":["../../src/sections/geometry-directory.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAY/D;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAkB,EAAE,aAAqB;IACjF,0EAA0E;IAC1E,2EAA2E;IAC3E,4EAA4E;IAC5E,uEAAuE;IACvE,kEAAkE;IAClE,2EAA2E;IAC3E,2EAA2E;IAC3E,iEAAiE;IACjE,yEAAyE;IACzE,uCAAuC;IACvC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,oDAAoD,IAAI,CAAC,UAAU,4BAA4B,aAAa,GAAG,CAAC,QAAQ,CACzH,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,2EAA2E;IAC3E,oEAAoE;IACpE,0EAA0E;IAC1E,sEAAsE;IACtE,sEAAsE;IACtE,0EAA0E;IAC1E,kEAAkE;IAClE,iCAAiC;IACjC,0EAA0E;IAC1E,0EAA0E;IAC1E,iEAAiE;IACjE,qEAAqE;IACrE,qEAAqE;IACrE,uEAAuE;IACvE,qEAAqE;IACrE,6DAA6D;IAC7D,yEAAyE;IACzE,yEAAyE;IACzE,4EAA4E;IAC5E,wEAAwE;IACxE,wEAAwE;IACxE,mEAAmE;IACnE,8BAA8B;IAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,iDAAiD;QACtF,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,8CAA8C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,oDAAoD,aAAa,GAAG,CAC5I,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;QACpF,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,iCAAiC,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,wDAAwD,aAAa,GAAG,CACnJ,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/sections/strings.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CA2B7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAuB7D"}
1
+ {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/sections/strings.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CA2B7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAiE7D"}
@@ -42,7 +42,44 @@ export function readStrings(reader) {
42
42
  const count = reader.readUint32();
43
43
  // Read offsets
44
44
  const offsets = reader.readUint32Array(count + 1);
45
- // Read total string data
45
+ // Validate the offset table BEFORE reading any string data. Reading
46
+ // first (`reader.readBytes(totalBytes)`) and validating after meant a
47
+ // corrupt `offsets[0]` (e.g. a hand-crafted or disk-corrupted cache with
48
+ // count = 0, offsets[0] = 500) still consumed `totalBytes` bytes from the
49
+ // reader before the anchor check threw -- silently eating whatever a
50
+ // following cache section holds and desyncing every read after this one,
51
+ // even though the error path never returns a StringTable. Validating
52
+ // first means a rejected table never advances the reader past the
53
+ // offsets array it just read.
54
+ //
55
+ // `data.subarray(offsets[i], offsets[i + 1])` SATURATES instead of
56
+ // throwing, so a corrupt/non-monotonic entry doesn't fail — it silently
57
+ // makes one string absorb bytes that belong to the next one (or produces
58
+ // an empty string), the same "declared length trusted without a bounds
59
+ // check" shape that bit the packed-geometry pool ranges and the LAS
60
+ // strided read. A writer always produces a non-decreasing sequence ending
61
+ // at `totalBytes`, so requiring monotonicity here rejects only
62
+ // corruption, never a legitimate table.
63
+ // Anchor the sequence before checking it is monotonic. The loop below
64
+ // compares each offset with its PREDECESSOR, and offset 0 has none -- so a
65
+ // table whose every offset is shifted by the same amount stays perfectly
66
+ // monotonic and passes while every string is read from the wrong place.
67
+ // The external anchor here is literal zero: the writer emits the first
68
+ // string at the start of the data blob.
69
+ // No `count > 0` guard here: the offsets array always has count+1
70
+ // elements (even for count === 0, a legitimate empty table still writes
71
+ // one element, offsets[0] === totalBytes === 0). Skipping the check when
72
+ // count is 0 let a corrupt file set offsets[0] to an arbitrary value,
73
+ // which flows unchecked into `totalBytes = offsets[count]` below.
74
+ if (offsets[0] !== 0) {
75
+ throw new Error(`Corrupt cache StringTable: first offset is ${offsets[0]}, expected 0`);
76
+ }
77
+ for (let i = 0; i < count; i++) {
78
+ if (offsets[i] > offsets[i + 1]) {
79
+ throw new Error(`Corrupt cache StringTable: offset[${i}]=${offsets[i]} exceeds offset[${i + 1}]=${offsets[i + 1]}`);
80
+ }
81
+ }
82
+ // Read total string data, now that the offset table is known-valid.
46
83
  const totalBytes = offsets[count];
47
84
  const data = reader.readBytes(totalBytes);
48
85
  // Decode strings positionally. The writer serialized `getAll()` by index, so
@@ -1 +1 @@
1
- {"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/sections/strings.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE,OAAoB;IACrE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;IAEhC,8BAA8B;IAC9B,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAiB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvE,oBAAoB;IACpB,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACxB,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAClC,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;IAE5B,cAAc;IACd,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE1B,sBAAsB;IACtB,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAEhC,iCAAiC;IACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAElC,eAAe;IACf,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAElD,yBAAyB;IACzB,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAE1C,6EAA6E;IAC7E,8EAA8E;IAC9E,4EAA4E;IAC5E,2EAA2E;IAC3E,4EAA4E;IAC5E,uEAAuE;IACvE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAa,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/sections/strings.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/cache",
3
- "version": "3.0.3",
3
+ "version": "3.0.4",
4
4
  "description": "Binary cache format for IFC-Lite - fast model loading",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -13,8 +13,8 @@
13
13
  }
14
14
  },
15
15
  "dependencies": {
16
- "@ifc-lite/data": "^3.2.2",
17
- "@ifc-lite/geometry": "^3.7.1"
16
+ "@ifc-lite/data": "^3.2.4",
17
+ "@ifc-lite/geometry": "^3.8.1"
18
18
  },
19
19
  "devDependencies": {
20
20
  "typescript": "^6.0.3",
@@ -45,6 +45,7 @@
45
45
  ],
46
46
  "scripts": {
47
47
  "build": "pnpm exec tsc",
48
+ "typecheck": "node ../../scripts/typecheck-tests.mjs",
48
49
  "dev": "pnpm exec tsc --watch",
49
50
  "test": "vitest run"
50
51
  }