foliojs / fontkit

An advanced font engine for Node and the browser
1.48k stars 219 forks source link

font.layout crashing on esoteric unicode character #312

Open alecjacobson opened 1 year ago

alecjacobson commented 1 year ago

I was stress testing a pipeline involving font.layout by running it on all characters which fontkit finds are in the set of a given font. For this Monaco.ttf.zip font.characterSet includes the unicode 63615. When I convert to a string and call font.layout, it crashes.

Here's a minimal example:

const fontkit = require('fontkit');
const font = fontkit.openSync("Monaco.ttf");
const all_codes = Array.from(font.characterSet);
const bad_code = all_codes.slice(-5)[0];
const bad_string = String.fromCodePoint(bad_code);
font.layout(bad_string);
node_modules/restructure/dist/main.cjs:91
        const ret = this.view[key](this.pos, false);
                                  ^

RangeError: Offset is outside the bounds of the DataView
    at DataView.getInt16 (<anonymous>)
    at $8ae20583b93e4933$export$c18b354bac7948e9.<computed> [as readInt16BE] (...node_modules/restructure/dist/main.cjs:91:35)
    at $af65abf7bf65ac42$export$fffa67e515d04022.decode (...node_modules/restructure/dist/main.cjs:268:40)
    at $aa8b66bae6abe658$export$eabc71f011df675a._parseFields (...node_modules/restructure/dist/main.cjs:732:29)
    at $aa8b66bae6abe658$export$eabc71f011df675a.decode (...node_modules/restructure/dist/main.cjs:703:14)
    at $f680320fa07ef53d$export$2e2bcd8739ae039._getCBox (...node_modules/fontkit/dist/main.cjs:10906:54)
    at $f680320fa07ef53d$export$2e2bcd8739ae039._getMetrics (...node_modules/fontkit/dist/main.cjs:11074:25)
    at get advanceWidth (...node_modules/fontkit/dist/main.cjs:10764:21)
    at descriptor.get (...node_modules/fontkit/dist/main.cjs:92:29)
    at ...node_modules/fontkit/dist/main.cjs:10141:115

Node.js v18.13.0