Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions docs/workflow/debugging/mono/wasm-debugging.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,14 +83,10 @@ and change the
This will hopefully cause the failure to happen reliably.

There is another random number generator in `upstream/emscripten/src/deterministic.js`
which needs the same treatment:
```
var randomBuffer3 = new Uint8Array(2);
crypto.getRandomValues(randomBuffer3);
which needs the same treatment.

var MAGIC = (randomBuffer3 [0] << 8) | randomBuffer3 [1];
console.log ("SEED2: " + MAGIC);
```
Running `make patch-deterministic` in `src/mono/wasm` will patch the
emscripten installation in `src/mono/wasm/emsdk` with these changes.

# Debugging signature mismatch errors

Expand Down
3 changes: 3 additions & 0 deletions src/mono/wasm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -140,3 +140,6 @@ build-dbg-proxy:
$(DOTNET) build $(TOP)/src/mono/wasm/debugger/BrowserDebugHost $(MSBUILD_ARGS)
build-dbg-testsuite:
$(DOTNET) build $(TOP)/src/mono/wasm/debugger/DebuggerTestSuite $(MSBUILD_ARGS)

patch-deterministic:
cd emsdk/upstream/emscripten/ && patch -p1 < ../../../runtime/deterministic.diff
41 changes: 41 additions & 0 deletions src/mono/wasm/runtime/deterministic.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
diff --git a/src/deterministic.js b/src/deterministic.js
index 0b894b4ac..05f50abba 100644
--- a/src/deterministic.js
+++ b/src/deterministic.js
@@ -4,7 +4,13 @@
* SPDX-License-Identifier: MIT
*/

-var MAGIC = 0;
+var randomBuffer3 = new Uint8Array(2);
+crypto.getRandomValues(randomBuffer3);
+
+var MAGIC = (randomBuffer3 [0] << 8) | randomBuffer3 [1];
+console.log ("SEED2: " + MAGIC);
+
+//var MAGIC = 0;
Math.random = () => {
MAGIC = Math.pow(MAGIC + 1.8912, 3) % 1;
return MAGIC;
diff --git a/src/library.js b/src/library.js
index 603f94dbf..698e9fe29 100644
--- a/src/library.js
+++ b/src/library.js
@@ -2196,6 +2196,17 @@ mergeInto(LibraryManager.library, {
// TODO: consider allowing the API to get a parameter for the number of
// bytes.
$getRandomDevice: function() {
+ var randomBuffer2 = new Uint8Array(2);
+ crypto.getRandomValues(randomBuffer2);
+
+ if (FS.seed2 == null)
+ FS.seed2 = (randomBuffer2 [0] << 8) | randomBuffer2 [1];
+ console.log('SEED: ' + FS.seed2);
+ return function() {
+ FS.seed2 = FS.seed2 * 16807 % 2147483647;
+ return FS.seed2;
+ };
+
if (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') {
// for modern web browsers
var randomBuffer = new Uint8Array(1);