From 60f16981ad362f7ba2f4cc3b5156685e3815aca0 Mon Sep 17 00:00:00 2001 From: Connor Manning Date: Sat, 1 Aug 2026 13:17:49 -0500 Subject: [PATCH] Fix leak in decompressFile, make memory freeing exception-safe in both decompress utilities. Fixes #16. --- src/las/point-data.ts | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/las/point-data.ts b/src/las/point-data.ts index 9280c81..28f2963 100644 --- a/src/las/point-data.ts +++ b/src/las/point-data.ts @@ -28,11 +28,15 @@ export async function decompressChunk( const LazPerf = await getLazPerf(suppliedLazPerf) const outBuffer = new Uint8Array(pointCount * pointDataRecordLength) - const blobPointer = LazPerf._malloc(compressed.byteLength) - const dataPointer = LazPerf._malloc(pointDataRecordLength) - const decoder = new LazPerf.ChunkDecoder() + let blobPointer = 0 + let dataPointer = 0 + let decoder: InstanceType | undefined try { + blobPointer = LazPerf._malloc(compressed.byteLength) + dataPointer = LazPerf._malloc(pointDataRecordLength) + decoder = new LazPerf.ChunkDecoder() + LazPerf.HEAPU8.set( new Uint8Array( compressed.buffer, @@ -59,7 +63,7 @@ export async function decompressChunk( } finally { LazPerf._free(blobPointer) LazPerf._free(dataPointer) - decoder.delete() + decoder?.delete() } return outBuffer @@ -74,10 +78,15 @@ export async function decompressFile( const { pointCount, pointDataRecordLength } = header const outBuffer = new Uint8Array(pointCount * pointDataRecordLength) - const blobPointer = LazPerf._malloc(file.byteLength) - const dataPointer = LazPerf._malloc(pointDataRecordLength) - const reader = new LazPerf.LASZip() + let blobPointer = 0 + let dataPointer = 0 + let reader: InstanceType | undefined + try { + blobPointer = LazPerf._malloc(file.byteLength) + dataPointer = LazPerf._malloc(pointDataRecordLength) + reader = new LazPerf.LASZip() + LazPerf.HEAPU8.set( new Uint8Array(file.buffer, file.byteOffset, file.byteLength), blobPointer, @@ -98,7 +107,9 @@ export async function decompressFile( ) } } finally { - reader.delete() + LazPerf._free(blobPointer) + LazPerf._free(dataPointer) + reader?.delete() } return outBuffer