From 9024a1b4da126edf460c3a072c4b699978daf8f7 Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Tue, 10 Nov 2026 10:27:45 +0000 Subject: [PATCH] Fix RangeError on a unicode property with an odd byte length Co-Authored-By: Claude Opus 5.5 --- src/MsgReader.ts | 2 +- test/test.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/MsgReader.ts b/src/MsgReader.ts index af65a38..28587f1 100644 --- a/src/MsgReader.ts +++ b/src/MsgReader.ts @@ -1535,7 +1535,7 @@ export default class MsgReader { skip = insideProps; } else if (decodeAs === "unicode") { - value = removeTrailingNull(ds.readUCS2String(array.length / 2)); + value = removeTrailingNull(ds.readUCS2String(Math.floor(array.length / 2))); skip = insideProps; } else if (decodeAs === "binary") { diff --git a/test/test.js b/test/test.js index fc04a83..e7bcf82 100644 --- a/test/test.js +++ b/test/test.js @@ -621,6 +621,17 @@ describe('MsgReader', function () { generateRegression('attachmentsOrder'); generateRegression('Many entities'); + it('reads a unicode property with an odd byte length', function () { + const { burn } = require('../lib/Burner'); + const body = new Uint8Array(Buffer.from('Hello')); + const array = burn([ + { name: 'Root Entry', type: TypeEnum.ROOT, length: 0, children: [1] }, + { name: '__substg1.0_1000001F', type: TypeEnum.DOCUMENT, length: body.length, binaryProvider: () => body }, + ]); + const fields = new MsgReader(array).getFileData(); + assert.strictEqual(fields.body, Buffer.from('Hell').toString('utf16le')); + }); + });