Skip to content

Commit 3b082ef

Browse files
committed
lib: reject SharedArrayBuffer in Blob constructor per spec
Signed-off-by: Ali Hassan <[email protected]>
1 parent a7f487f commit 3b082ef

2 files changed

Lines changed: 32 additions & 2 deletions

File tree

lib/internal/blob.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,12 @@ function getSource(source, endings) {
127127
}
128128

129129
const sourcesConverter = createSequenceConverter((source, opts = kEmptyObject) => {
130-
if (isBlob(source) || isAnyArrayBuffer(source) || isArrayBufferView(source)) {
130+
if (isBlob(source)) {
131131
return source;
132132
}
133+
if (isAnyArrayBuffer(source) || isArrayBufferView(source)) {
134+
return converters.BufferSource(source, opts);
135+
}
133136
return converters.DOMString(source, opts);
134137
});
135138

@@ -149,7 +152,10 @@ class Blob {
149152
constructor(sources = [], options) {
150153
markTransferMode(this, true, false);
151154

152-
const sources_ = sourcesConverter(sources);
155+
const sources_ = sourcesConverter(sources, {
156+
__proto__: null,
157+
context: 'sources',
158+
});
153159

154160
validateDictionary(options, 'options');
155161
let {

test/parallel/test-webapi-sharedarraybuffer-rejection.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const common = require('../common');
44
const assert = require('assert');
55
const test = require('node:test');
6+
const { Blob } = require('buffer');
67
const { ReadableStream } = require('stream/web');
78

89
const sab = new SharedArrayBuffer(8);
@@ -98,6 +99,29 @@ test('ReadableByteStreamController.enqueue() rejects SAB-backed DataView', async
9899
reader.releaseLock();
99100
});
100101

102+
// -- Blob --
103+
104+
test('Blob rejects SharedArrayBuffer part', () => {
105+
assert.throws(
106+
() => new Blob([sab]),
107+
{ code: 'ERR_INVALID_ARG_TYPE' },
108+
);
109+
});
110+
111+
test('Blob rejects SAB-backed Uint8Array part', () => {
112+
assert.throws(
113+
() => new Blob([sabView]),
114+
{ code: 'ERR_INVALID_ARG_TYPE' },
115+
);
116+
});
117+
118+
test('Blob rejects SAB-backed DataView part', () => {
119+
assert.throws(
120+
() => new Blob([sabDataView]),
121+
{ code: 'ERR_INVALID_ARG_TYPE' },
122+
);
123+
});
124+
101125
// -- SharedWebIDL converters --
102126

103127
const { converters } = require('internal/webidl');

0 commit comments

Comments
 (0)