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

fix(webidl): Don't throw when converting a detached buffer source (#12585)

The Web IDL conversion to `BufferSource` and similar types shouldn't
check whether the buffer is detached.

In the case of `TextDecoder`, our implementation would still throw after
the Web IDL conversions because we're creating a new `Uint8Array` from
the buffer source's buffer, which throws if it's detached. This change
also fixes this bug.
This commit is contained in:
Andreu Botella 2021-10-28 14:17:27 -07:00 committed by GitHub
parent 507ab50e0f
commit 74a93fdf63
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 61 deletions

View file

@ -105,14 +105,19 @@
}
try {
if (ArrayBufferIsView(input)) {
input = new Uint8Array(
input.buffer,
input.byteOffset,
input.byteLength,
);
} else {
input = new Uint8Array(input);
try {
if (ArrayBufferIsView(input)) {
input = new Uint8Array(
input.buffer,
input.byteOffset,
input.byteLength,
);
} else {
input = new Uint8Array(input);
}
} catch {
// If the buffer is detached, just create a new empty Uint8Array.
input = new Uint8Array();
}
if (input.buffer instanceof SharedArrayBuffer) {
// We clone the data into a non-shared ArrayBuffer so we can pass it

View file

@ -441,15 +441,6 @@
return V instanceof SharedArrayBuffer;
}
function isArrayBufferDetached(V) {
try {
new Uint8Array(V);
return false;
} catch {
return true;
}
}
converters.ArrayBuffer = (V, opts = {}) => {
if (!isNonSharedArrayBuffer(V)) {
if (opts.allowShared && !isSharedArrayBuffer(V)) {
@ -461,9 +452,6 @@
}
throw makeException(TypeError, "is not an ArrayBuffer", opts);
}
if (isArrayBufferDetached(V)) {
throw makeException(TypeError, "is a detached ArrayBuffer", opts);
}
return V;
};
@ -480,13 +468,6 @@
opts,
);
}
if (isArrayBufferDetached(V.buffer)) {
throw makeException(
TypeError,
"is backed by a detached ArrayBuffer",
opts,
);
}
return V;
};
@ -529,13 +510,6 @@
opts,
);
}
if (isArrayBufferDetached(V.buffer)) {
throw makeException(
TypeError,
"is a view on a detached ArrayBuffer",
opts,
);
}
return V;
};
@ -561,13 +535,6 @@
);
}
if (isArrayBufferDetached(V.buffer)) {
throw makeException(
TypeError,
"is a view on a detached ArrayBuffer",
opts,
);
}
return V;
};
@ -581,13 +548,6 @@
);
}
if (isArrayBufferDetached(V.buffer)) {
throw makeException(
TypeError,
"is a view on a detached ArrayBuffer",
opts,
);
}
return V;
}
@ -609,9 +569,6 @@
opts,
);
}
if (isArrayBufferDetached(V)) {
throw makeException(TypeError, "is a detached ArrayBuffer", opts);
}
return V;
};

View file

@ -5908,7 +5908,6 @@
"api-surrogates-utf8.any.html": true,
"api-surrogates-utf8.any.worker.html": true,
"encodeInto.any.html": [
"encodeInto() and a detached output buffer",
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 0",
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 0",
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 128",
@ -5953,7 +5952,6 @@
"encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler random"
],
"encodeInto.any.worker.html": [
"encodeInto() and a detached output buffer",
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 0",
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 0",
"encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 128",
@ -6028,14 +6026,8 @@
"decode-non-utf8.any.worker.html": true,
"decode-split-character.any.html": true,
"decode-split-character.any.worker.html": true,
"decode-utf8.any.html": [
"decoding a transferred Uint8Array chunk should give no output",
"decoding a transferred ArrayBuffer chunk should give no output"
],
"decode-utf8.any.worker.html": [
"decoding a transferred Uint8Array chunk should give no output",
"decoding a transferred ArrayBuffer chunk should give no output"
],
"decode-utf8.any.html": true,
"decode-utf8.any.worker.html": true,
"encode-bad-chunks.any.html": true,
"encode-bad-chunks.any.worker.html": true,
"encode-utf8.any.html": true,