From 79e6fecc4ab39f65acfe68f283a63b425bfdeece Mon Sep 17 00:00:00 2001 From: Jakob Ackermann Date: Mon, 31 Oct 2022 11:47:53 +0000 Subject: [PATCH] Merge pull request #10231 from overleaf/jpa-pdf-caching-bounds-debug [web] pdf-caching: debug bounds when reassembling the range from chunks GitOrigin-RevId: 11871241d07880ebd2659cc5d0feb1f2c29014b6 --- .../features/pdf-preview/util/pdf-caching.js | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/services/web/frontend/js/features/pdf-preview/util/pdf-caching.js b/services/web/frontend/js/features/pdf-preview/util/pdf-caching.js index d4a88cde94..b752b6c794 100644 --- a/services/web/frontend/js/features/pdf-preview/util/pdf-caching.js +++ b/services/web/frontend/js/features/pdf-preview/util/pdf-caching.js @@ -843,13 +843,36 @@ export async function fetchRange({ // | REQUESTED_RANGE | // | CHUNK | const offsetEnd = Math.max(chunk.end - end, 0) + const oldDataLength = data.length if (offsetStart > 0 || offsetEnd > 0) { // compute index positions for slice to handle case where offsetEnd=0 const chunkSize = chunk.end - chunk.start data = data.subarray(offsetStart, chunkSize - offsetEnd) } + const newDataLength = data.length const insertPosition = Math.max(chunk.start - start, 0) - reassembledBlob.set(data, insertPosition) + try { + reassembledBlob.set(data, insertPosition) + } catch (err) { + const reassembledBlobLength = reassembledBlob.length + const trimmedChunk = { + start: chunk.start, + end: chunk.end, + hash: chunk.hash, + objectId: new TextDecoder().decode(chunk.objectId), + } + throw OError.tag(err, 'broken reassembly', { + start, + end, + chunk: trimmedChunk, + oldDataLength, + newDataLength, + offsetStart, + offsetEnd, + insertPosition, + reassembledBlobLength, + }) + } }) timer.finishBlockingCompute()