Skip to content

Commit 15ba984

Browse files
committed
[AUDIO_WORKLET] Fix getentropy when called from an audio worklet.
Fixes: #26522, #13224
1 parent 0182d72 commit 15ba984

20 files changed

Lines changed: 136 additions & 120 deletions

src/lib/libwasi.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -593,27 +593,29 @@ var WasiLibrary = {
593593
}
594594
#endif
595595

596+
#if ENVIRONMENT_MAY_BE_AUDIO_WORKLET
597+
// Audio worklets don't support crypto.getRandomValues
598+
if (!globalThis.crypto) {
599+
return () => {{{ cDefs.ENOTSUP }}};
600+
}
601+
#endif
602+
596603
#if SHARED_MEMORY
597604
// like with most Web APIs, we can't use Web Crypto API directly on shared memory,
598605
// so we need to create an intermediate buffer and copy it to the destination
599-
return (view) => view.set(crypto.getRandomValues(new Uint8Array(view.byteLength)));
606+
return (view) => (view.set(crypto.getRandomValues(new Uint8Array(view.byteLength))), 0);
600607
#else
601-
return (view) => crypto.getRandomValues(view);
608+
return (view) => (crypto.getRandomValues(view), 0);
602609
#endif
603610
},
604611

605612
$randomFill__deps: ['$initRandomFill'],
606-
$randomFill: (view) => {
607-
// Lazily init on the first invocation.
608-
(randomFill = initRandomFill())(view);
609-
},
613+
// Lazily init on the first invocation.
614+
$randomFill: (view) => (randomFill = initRandomFill())(view),
610615

611616
random_get__proxy: 'none',
612617
random_get__deps: ['$randomFill'],
613-
random_get: (buffer, size) => {
614-
randomFill(HEAPU8.subarray(buffer, buffer + size));
615-
return 0;
616-
},
618+
random_get: (buffer, size) => randomFill(HEAPU8.subarray(buffer, buffer + size)),
617619
};
618620

619621
for (var x in WasiLibrary) {

system/lib/libc/musl/src/misc/getentropy.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ int getentropy(void *buffer, size_t len)
1818
return -1;
1919
}
2020

21-
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
22-
2321
#ifdef __EMSCRIPTEN__
2422
ret = __wasi_syscall_ret(__wasi_random_get(buffer, len));
2523
#else
24+
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
25+
2626
while (len) {
2727
ret = getrandom(pos, len, 0);
2828
if (ret < 0) {
@@ -33,9 +33,9 @@ int getentropy(void *buffer, size_t len)
3333
len -= ret;
3434
ret = 0;
3535
}
36-
#endif
3736

3837
pthread_setcancelstate(cs, 0);
38+
#endif
3939

4040
return ret;
4141
}

test/codesize/audio_worklet_wasm.expected.js

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ if (p) {
4242
var H = 0;
4343
for (f of g) H += f.length;
4444
n += H * this.s;
45-
var N = 0;
46-
for (f in e) ++N, k += 8, n += e[f].byteLength;
47-
var U = C(), B = k + n + 15 & -16;
45+
var O = 0;
46+
for (f in e) ++O, k += 8, n += e[f].byteLength;
47+
var V = C(), B = k + n + 15 & -16;
4848
k = D(B);
4949
n = k + (B - n);
5050
B = k;
@@ -61,8 +61,8 @@ if (p) {
6161
e = k;
6262
for (f of g) G[k >> 2] = f.length, G[k + 4 >> 2] = this.u, G[k + 8 >> 2] = n, k += 12,
6363
n += this.s * f.length;
64-
if (l = this.v(l, B, q, e, N, d, this.A)) for (f of g) for (r of f) r.set(this.B[--H]);
65-
F(U);
64+
if (l = this.v(l, B, q, e, O, d, this.A)) for (f of g) for (r of f) r.set(this.B[--H]);
65+
F(V);
6666
return !!l;
6767
}
6868
}
@@ -109,9 +109,9 @@ var K = [], L = a => {
109109
}, M = a => {
110110
K.push(a);
111111
}, P = (a, c, b, h) => {
112-
c = O[c];
113-
O[a].connect(c.destination || c, b, h);
114-
}, O = {}, Q = 0, R = globalThis.TextDecoder && new TextDecoder, S = (a = 0) => {
112+
c = N[c];
113+
N[a].connect(c.destination || c, b, h);
114+
}, N = {}, Q = 0, R = globalThis.TextDecoder && new TextDecoder, S = (a = 0) => {
115115
for (var c = I, b = a, h = b + void 0; c[b] && !(b >= h); ) ++b;
116116
if (16 < b - a && c.buffer && R) return R.decode(c.slice(a, b));
117117
for (h = ""; a < b; ) {
@@ -138,9 +138,9 @@ var K = [], L = a => {
138138
};
139139
} else a = void 0;
140140
a = new AudioContext(a);
141-
O[++Q] = a;
141+
N[++Q] = a;
142142
return Q;
143-
}, V = (a, c, b, h, d) => {
143+
}, U = (a, c, b, h, d) => {
144144
var g = b ? J[b + 4 >> 2] : 0;
145145
if (b) {
146146
var e = J[b >> 2], l = G[b + 8 >> 2], q = g;
@@ -159,14 +159,14 @@ var K = [], L = a => {
159159
processorOptions: {
160160
v: h,
161161
A: d,
162-
u: O[a].renderQuantumSize || 128
162+
u: N[a].renderQuantumSize || 128
163163
}
164164
};
165165
} else b = void 0;
166-
a = new AudioWorkletNode(O[a], c ? S(c) : "", b);
167-
O[++Q] = a;
166+
a = new AudioWorkletNode(N[a], c ? S(c) : "", b);
167+
N[++Q] = a;
168168
return Q;
169-
}, W = (a, c, b, h) => {
169+
}, aa = (a, c, b, h) => {
170170
var d = (d = G[c >> 2]) ? S(d) : "", g = J[c + 4 >> 2];
171171
c = G[c + 8 >> 2];
172172
for (var e = [], l = 0; g--; ) e.push({
@@ -176,19 +176,19 @@ var K = [], L = a => {
176176
maxValue: E[c + 8 >> 2],
177177
automationRate: (J[c + 12 >> 2] ? "k" : "a") + "-rate"
178178
}), c += 16;
179-
O[a].audioWorklet.port.postMessage({
179+
N[a].audioWorklet.port.postMessage({
180180
_wpn: d,
181181
I: e,
182182
J: a,
183183
v: b,
184184
A: h
185185
});
186-
}, aa = () => !1, ba = 1, ca = a => {
186+
}, ba = () => !1, ca = 1, da = a => {
187187
a = a.data;
188188
var c = a._wsc;
189189
c && A.get(c)(...a.C);
190-
}, da = (a, c, b, h, d) => {
191-
var g = O[a], e = g.audioWorklet, l = () => {
190+
}, ea = (a, c, b, h, d) => {
191+
var g = N[a], e = g.audioWorklet, l = () => {
192192
A.get(h)(a, 0, d);
193193
};
194194
if (!e) return l();
@@ -204,50 +204,52 @@ var K = [], L = a => {
204204
});
205205
e.port.postMessage({
206206
_boot: 1,
207-
M: ba++,
207+
M: ca++,
208208
G: m.wasm,
209209
H: w,
210210
K: c,
211211
F: b
212212
});
213-
e.port.onmessage = ca;
213+
e.port.onmessage = da;
214214
A.get(h)(a, 1, d);
215215
})).catch(l);
216-
};
216+
}, fa = () => globalThis.crypto ? a => (a.set(crypto.getRandomValues(new Uint8Array(a.byteLength))),
217+
0) : () => 138, W = a => (W = fa())(a), ha = (a, c) => W(I.subarray(a, a + c));
217218

218-
function ea(a) {
219+
function ia(a) {
219220
let c = document.createElement("button");
220221
c.innerHTML = "Toggle playback";
221222
document.body.appendChild(c);
222-
a = O[a];
223+
a = N[a];
223224
c.onclick = () => {
224225
"running" != a.state ? a.resume() : a.suspend();
225226
};
226227
}
227228

228229
function y() {
229230
Z = {
230-
f: ea,
231-
g: P,
232-
d: T,
233-
h: V,
234-
e: W,
235-
b: aa,
236-
c: da,
237-
a: w
231+
g: ia,
232+
h: P,
233+
e: T,
234+
i: U,
235+
f: aa,
236+
b: ba,
237+
d: ea,
238+
a: w,
239+
c: ha
238240
};
239241
z = WebAssembly.instantiate(m.wasm, {
240242
a: Z
241243
}).then((a => {
242244
a = (a.instance || a).exports;
243-
X = a.j;
244-
F = a.l;
245-
D = a.m;
246-
C = a.n;
247-
Y = a.o;
248-
A = a.k;
245+
X = a.k;
246+
F = a.m;
247+
D = a.n;
248+
C = a.o;
249+
Y = a.p;
250+
A = a.l;
249251
t ? (Y(u.M, u.K, u.F), p || (removeEventListener("message", M), K = K.forEach(L),
250-
addEventListener("message", L))) : a.i();
252+
addEventListener("message", L))) : a.j();
251253
t || X();
252254
}));
253255
}

test/codesize/test_codesize_cxx_ctors1.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"a.out.js": 19214,
3-
"a.out.js.gz": 7981,
2+
"a.out.js": 19216,
3+
"a.out.js.gz": 7985,
44
"a.out.nodebug.wasm": 132638,
55
"a.out.nodebug.wasm.gz": 49927,
6-
"total": 151852,
7-
"total_gz": 57908,
6+
"total": 151854,
7+
"total_gz": 57912,
88
"sent": [
99
"__cxa_throw",
1010
"_abort_js",

test/codesize/test_codesize_cxx_ctors2.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"a.out.js": 19191,
3-
"a.out.js.gz": 7966,
2+
"a.out.js": 19193,
3+
"a.out.js.gz": 7971,
44
"a.out.nodebug.wasm": 132064,
55
"a.out.nodebug.wasm.gz": 49586,
6-
"total": 151255,
7-
"total_gz": 57552,
6+
"total": 151257,
7+
"total_gz": 57557,
88
"sent": [
99
"__cxa_throw",
1010
"_abort_js",

test/codesize/test_codesize_cxx_except.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"a.out.js": 22875,
3-
"a.out.js.gz": 8956,
2+
"a.out.js": 22877,
3+
"a.out.js.gz": 8958,
44
"a.out.nodebug.wasm": 172516,
55
"a.out.nodebug.wasm.gz": 57438,
6-
"total": 195391,
7-
"total_gz": 66394,
6+
"total": 195393,
7+
"total_gz": 66396,
88
"sent": [
99
"__cxa_begin_catch",
1010
"__cxa_end_catch",

test/codesize/test_codesize_cxx_except_wasm.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
2-
"a.out.js": 19025,
2+
"a.out.js": 19027,
33
"a.out.js.gz": 7908,
44
"a.out.nodebug.wasm": 147922,
55
"a.out.nodebug.wasm.gz": 55312,
6-
"total": 166947,
6+
"total": 166949,
77
"total_gz": 63220,
88
"sent": [
99
"_abort_js",

test/codesize/test_codesize_cxx_except_wasm_legacy.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"a.out.js": 19099,
3-
"a.out.js.gz": 7930,
2+
"a.out.js": 19101,
3+
"a.out.js.gz": 7933,
44
"a.out.nodebug.wasm": 145729,
55
"a.out.nodebug.wasm.gz": 54945,
6-
"total": 164828,
7-
"total_gz": 62875,
6+
"total": 164830,
7+
"total_gz": 62878,
88
"sent": [
99
"_abort_js",
1010
"_tzset_js",

test/codesize/test_codesize_cxx_lto.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"a.out.js": 18562,
3-
"a.out.js.gz": 7668,
2+
"a.out.js": 18564,
3+
"a.out.js.gz": 7670,
44
"a.out.nodebug.wasm": 101954,
55
"a.out.nodebug.wasm.gz": 39462,
6-
"total": 120516,
7-
"total_gz": 47130,
6+
"total": 120518,
7+
"total_gz": 47132,
88
"sent": [
99
"a (emscripten_resize_heap)",
1010
"b (_setitimer_js)",

test/codesize/test_codesize_cxx_mangle.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"a.out.js": 22925,
3-
"a.out.js.gz": 8978,
2+
"a.out.js": 22927,
3+
"a.out.js.gz": 8980,
44
"a.out.nodebug.wasm": 238957,
55
"a.out.nodebug.wasm.gz": 79847,
6-
"total": 261882,
7-
"total_gz": 88825,
6+
"total": 261884,
7+
"total_gz": 88827,
88
"sent": [
99
"__cxa_begin_catch",
1010
"__cxa_end_catch",

0 commit comments

Comments
 (0)