0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 09:31:22 -05:00

Check destination length in encodeInto (#5078)

This commit is contained in:
Nikolai Vavilov 2020-05-06 20:10:15 +03:00 committed by GitHub
parent 91369841ef
commit 76c77bb32c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 15 deletions

View file

@ -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);

View file

@ -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;
}
}