diff options
author | Nikolai Vavilov <vvnicholas@gmail.com> | 2020-05-06 20:10:15 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-06 13:10:15 -0400 |
commit | 76c77bb32c642283e61c9a6bb4936401fc43eaba (patch) | |
tree | 2103b4a94cc285b0164a744e486c0ea7b3e2adc5 | |
parent | 91369841ef19b41dcdc7934d39620fedc3a0f6c8 (diff) |
Check destination length in encodeInto (#5078)
-rw-r--r-- | cli/js/tests/text_encoding_test.ts | 13 | ||||
-rw-r--r-- | cli/js/web/text_encoding.ts | 25 |
2 files changed, 23 insertions, 15 deletions
diff --git a/cli/js/tests/text_encoding_test.ts b/cli/js/tests/text_encoding_test.ts index c8a7fbe42..87b601f36 100644 --- a/cli/js/tests/text_encoding_test.ts +++ b/cli/js/tests/text_encoding_test.ts @@ -158,6 +158,19 @@ unitTest(function textEncodeInto2(): void { ]); }); +unitTest(function textEncodeInto3(): void { + const fixture = "𝓽𝓮𝔁𝓽"; + const encoder = new TextEncoder(); + const bytes = new Uint8Array(5); + const result = encoder.encodeInto(fixture, bytes); + assertEquals(result.read, 2); + assertEquals(result.written, 4); + // prettier-ignore + assertEquals(Array.from(bytes), [ + 0xf0, 0x9d, 0x93, 0xbd, 0x00, + ]); +}); + unitTest(function textDecoderSharedUint8Array(): void { const ab = new SharedArrayBuffer(6); const dataView = new DataView(ab); diff --git a/cli/js/web/text_encoding.ts b/cli/js/web/text_encoding.ts index e54cf0418..9f9b4e220 100644 --- a/cli/js/web/text_encoding.ts +++ b/cli/js/web/text_encoding.ts @@ -55,13 +55,13 @@ function stringToCodePoints(input: string): number[] { } class UTF8Encoder implements Encoder { - handler(codePoint: number): number | number[] { + handler(codePoint: number): "finished" | number[] { if (codePoint === END_OF_STREAM) { - return FINISHED; + return "finished"; } if (inRange(codePoint, 0x00, 0x7f)) { - return codePoint; + return [codePoint]; } let count: number; @@ -144,7 +144,7 @@ interface Decoder { } interface Encoder { - handler(codePoint: number): number | number[]; + handler(codePoint: number): "finished" | number[]; } class SingleByteDecoder implements Decoder { @@ -534,14 +534,10 @@ export class TextEncoder { while (true) { const result = encoder.handler(inputStream.read()); - if (result === FINISHED) { + if (result === "finished") { break; } - if (Array.isArray(result)) { - output.push(...result); - } else { - output.push(result); - } + output.push(...result); } return new Uint8Array(output); @@ -554,11 +550,11 @@ export class TextEncoder { let read = 0; while (true) { const result = encoder.handler(inputStream.read()); - if (result === FINISHED) { + if (result === "finished") { break; } - read++; - if (Array.isArray(result)) { + if (dest.length - written >= result.length) { + read++; dest.set(result, written); written += result.length; if (result.length > 3) { @@ -566,8 +562,7 @@ export class TextEncoder { read++; } } else { - dest[written] = result; - written++; + break; } } |