From 608a40f90eaccc48771544cf6e1eab75f432717e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?TATSUNO=20=E2=80=9CTaz=E2=80=9D=20Yasuhiro?= Date: Mon, 26 Jan 2026 22:49:15 +0900 Subject: [PATCH 1/4] chore: replace deprecated jpeg-exif with own implementation --- lib/image/jpeg.js | 77 +++++++++++++++++++++++++++++++++++++++++++++-- package.json | 1 - rollup.config.js | 3 +- yarn.lock | 8 ----- 4 files changed, 76 insertions(+), 13 deletions(-) diff --git a/lib/image/jpeg.js b/lib/image/jpeg.js index 9fadb8bf..58f00cae 100644 --- a/lib/image/jpeg.js +++ b/lib/image/jpeg.js @@ -1,4 +1,77 @@ -import exif from 'jpeg-exif'; +/** + * Parse EXIF orientation from JPEG buffer + * @param {Buffer} data - JPEG image data + * @returns {number|null} Orientation value (1-8) or null if not found + */ +function parseExifOrientation(data) { + if (!data || data.length < 20) return null; + + let pos = 2; // Skip SOI marker + + while (pos < data.length - 4) { + // Skip padding bytes (some JPEG files have null bytes between segments) + while (pos < data.length && data[pos] !== 0xff) pos++; + if (pos >= data.length - 4) return null; + + const marker = data.readUInt16BE(pos); + pos += 2; + + // SOS marker - image data starts, stop searching + if (marker === 0xffda) return null; + + // Skip standalone markers + if ((marker >= 0xffd0 && marker <= 0xffd9) || marker === 0xff01) continue; + + if (pos + 2 > data.length) return null; + const segmentLength = data.readUInt16BE(pos); + + // APP1 (EXIF) marker + if (marker === 0xffe1 && pos + 8 <= data.length) { + const exifHeader = data.slice(pos + 2, pos + 8).toString('binary'); + if (exifHeader === 'Exif\x00\x00') { + const tiffStart = pos + 8; + if (tiffStart + 8 > data.length) return null; + + // Byte order + const byteOrder = data.slice(tiffStart, tiffStart + 2).toString('ascii'); + const le = byteOrder === 'II'; + if (!le && byteOrder !== 'MM') return null; + + const read16 = le + ? (o) => data.readUInt16LE(o) + : (o) => data.readUInt16BE(o); + const read32 = le + ? (o) => data.readUInt32LE(o) + : (o) => data.readUInt32BE(o); + + // Verify TIFF magic number (42) + if (read16(tiffStart + 2) !== 42) return null; + + // IFD0 offset + const ifdPos = tiffStart + read32(tiffStart + 4); + if (ifdPos + 2 > data.length) return null; + + const entryCount = read16(ifdPos); + + // Scan IFD entries for Orientation tag (0x0112) + for (let i = 0; i < entryCount; i++) { + const entryPos = ifdPos + 2 + i * 12; + if (entryPos + 12 > data.length) return null; + + if (read16(entryPos) === 0x0112) { + const value = read16(entryPos + 8); + return value >= 1 && value <= 8 ? value : null; + } + } + return null; + } + } + + pos += segmentLength; + } + + return null; +} const MARKERS = [ 0xffc0, 0xffc1, 0xffc2, 0xffc3, 0xffc5, 0xffc6, 0xffc7, 0xffc8, 0xffc9, @@ -21,7 +94,7 @@ class JPEG { } // Parse the EXIF orientation - this.orientation = exif.fromBuffer(this.data).Orientation || 1; + this.orientation = parseExifOrientation(this.data) || 1; let pos = 2; while (pos < this.data.length) { diff --git a/package.json b/package.json index 25164ae7..d488e834 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,6 @@ "dependencies": { "crypto-js": "^4.2.0", "fontkit": "^2.0.4", - "jpeg-exif": "^1.1.4", "linebreak": "^1.1.0", "png-js": "^1.0.0" }, diff --git a/rollup.config.js b/rollup.config.js index c3a8b867..7e20d154 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -11,8 +11,7 @@ const external = [ 'linebreak', 'png-js', 'crypto-js', - 'saslprep', - 'jpeg-exif' + 'saslprep' ]; const supportedBrowsers = [ diff --git a/yarn.lock b/yarn.lock index 65ef81cb..1c2560ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5324,13 +5324,6 @@ __metadata: languageName: node linkType: hard -"jpeg-exif@npm:^1.1.4": - version: 1.1.4 - resolution: "jpeg-exif@npm:1.1.4" - checksum: 10c0/0f9225b2423184d60c66b3d7361176801c17ede92fc9b3c044fcf00f379a5a1d424b360ecf0027dda47d405d253c7b62bf5b353fb08b2589e3650f38cc575e82 - languageName: node - linkType: hard - "js-stringify@npm:^1.0.2": version: 1.0.2 resolution: "js-stringify@npm:1.0.2" @@ -6325,7 +6318,6 @@ __metadata: globals: "npm:^15.14.0" jest: "npm:^29.7.0" jest-image-snapshot: "npm:^6.4.0" - jpeg-exif: "npm:^1.1.4" linebreak: "npm:^1.1.0" markdown: "npm:~0.5.0" pdfjs-dist: "npm:^2.14.305" From 1b8af8914214ad1d40af31af84a871432a0aacbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?TATSUNO=20=E2=80=9CTaz=E2=80=9D=20Yasuhiro?= Date: Mon, 26 Jan 2026 22:51:09 +0900 Subject: [PATCH 2/4] fix: robust handle null byte padding --- lib/image/jpeg.js | 4 ++++ tests/images/issue-1175.jpeg | Bin 0 -> 44316 bytes tests/unit/image.spec.js | 10 ++++++++++ 3 files changed, 14 insertions(+) create mode 100644 tests/images/issue-1175.jpeg diff --git a/lib/image/jpeg.js b/lib/image/jpeg.js index 58f00cae..ebe389d4 100644 --- a/lib/image/jpeg.js +++ b/lib/image/jpeg.js @@ -98,6 +98,10 @@ class JPEG { let pos = 2; while (pos < this.data.length) { + // Skip padding bytes (some JPEG files have null bytes between segments) + while (pos < this.data.length && this.data[pos] !== 0xff) pos++; + if (pos >= this.data.length) break; + marker = this.data.readUInt16BE(pos); pos += 2; if (MARKERS.includes(marker)) { diff --git a/tests/images/issue-1175.jpeg b/tests/images/issue-1175.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c95aeb580cb30181b9ebd6b8d5963c55726e7374 GIT binary patch literal 44316 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

Zp>pmX-?+JnF#}8ac#weRMA7IX*yCWzj(N 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 { + const data = fs.readFileSync('./tests/images/issue-1175.jpeg'); + const jpeg = new JPEG(data, 'test'); + expect(jpeg.width).toBe(375); + expect(jpeg.height).toBe(500); + expect(jpeg.orientation).toBe(1); + }); }); From 64817f20017c5c5b0579f652cfec1c77725cc5d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?TATSUNO=20=E2=80=9CTaz=E2=80=9D=20Yasuhiro?= Date: Mon, 26 Jan 2026 22:53:04 +0900 Subject: [PATCH 3/4] chore: changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dfe1cd0..5d63b0a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ - Preserve existing PageMode instead of overwriting when adding outlines - Add userUnit option for custom page units (PDF 1.6) - Support outlines that jump to specific page positions with custom zoom level +- Add robust handling of null byte padding in JPEG images +- Replace outdated jpeg-exif with minimal implementation ### [v0.17.2] - 2025-08-30 From 501b0c57f8658cee9bd67d5688cd75d292a30b18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?TATSUNO=20=E2=80=9CTaz=E2=80=9D=20Yasuhiro?= Date: Mon, 26 Jan 2026 22:58:28 +0900 Subject: [PATCH 4/4] chore: minor refactoring --- lib/image/jpeg.js | 18 ++++++++++-------- tests/unit/image.spec.js | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/image/jpeg.js b/lib/image/jpeg.js index ebe389d4..8510df32 100644 --- a/lib/image/jpeg.js +++ b/lib/image/jpeg.js @@ -3,7 +3,7 @@ * @param {Buffer} data - JPEG image data * @returns {number|null} Orientation value (1-8) or null if not found */ -function parseExifOrientation(data) { +const parseExifOrientation = (data) => { if (!data || data.length < 20) return null; let pos = 2; // Skip SOI marker @@ -27,20 +27,22 @@ function parseExifOrientation(data) { // APP1 (EXIF) marker if (marker === 0xffe1 && pos + 8 <= data.length) { - const exifHeader = data.slice(pos + 2, pos + 8).toString('binary'); + const exifHeader = data.subarray(pos + 2, pos + 8).toString('binary'); if (exifHeader === 'Exif\x00\x00') { const tiffStart = pos + 8; if (tiffStart + 8 > data.length) return null; // Byte order - const byteOrder = data.slice(tiffStart, tiffStart + 2).toString('ascii'); - const le = byteOrder === 'II'; - if (!le && byteOrder !== 'MM') return null; + const byteOrder = data + .subarray(tiffStart, tiffStart + 2) + .toString('ascii'); + const isLittleEndian = byteOrder === 'II'; + if (!isLittleEndian && byteOrder !== 'MM') return null; - const read16 = le + const read16 = isLittleEndian ? (o) => data.readUInt16LE(o) : (o) => data.readUInt16BE(o); - const read32 = le + const read32 = isLittleEndian ? (o) => data.readUInt32LE(o) : (o) => data.readUInt32BE(o); @@ -71,7 +73,7 @@ function parseExifOrientation(data) { } return null; -} +}; const MARKERS = [ 0xffc0, 0xffc1, 0xffc2, 0xffc3, 0xffc5, 0xffc6, 0xffc7, 0xffc8, 0xffc9, diff --git a/tests/unit/image.spec.js b/tests/unit/image.spec.js index 2d25f059..af6e4cf1 100644 --- a/tests/unit/image.spec.js +++ b/tests/unit/image.spec.js @@ -21,7 +21,7 @@ describe('Image', function () { expect(document.y).toBe(originalY + imageHeight); }); - test('should parse JPEG with EXIF data (issue #1175)', () => { + test('parse JPEG with null byte padding in EXIF (issue #1175)', () => { const data = fs.readFileSync('./tests/images/issue-1175.jpeg'); const jpeg = new JPEG(data, 'test'); expect(jpeg.width).toBe(375);