From d54ca66dfd2430157e56d97c12c45419facb84cd Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Wed, 11 May 2022 17:16:16 +0200 Subject: [PATCH 1/3] Fix a crash occurring when a jsFS callback is called without arguments --- compiler/natives/src/syscall/fs_js.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/compiler/natives/src/syscall/fs_js.go b/compiler/natives/src/syscall/fs_js.go index 39a71e57d..d027d7be5 100644 --- a/compiler/natives/src/syscall/fs_js.go +++ b/compiler/natives/src/syscall/fs_js.go @@ -22,8 +22,10 @@ func fsCall(name string, args ...interface{}) (js.Value, error) { f := js.FuncOf(func(this js.Value, args []js.Value) interface{} { var res callResult - if jsErr := args[0]; !jsErr.IsNull() { - res.err = mapJSError(jsErr) + if len(args) >= 1 { + if jsErr := args[0]; !jsErr.IsNull() { + res.err = mapJSError(jsErr) + } } res.val = js.Undefined() From ce5430d759059bb010c5797936607c6c940af345 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Wed, 11 May 2022 17:17:00 +0200 Subject: [PATCH 2/3] Protect against jsFS callback error argument being undefined --- compiler/natives/src/syscall/fs_js.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/natives/src/syscall/fs_js.go b/compiler/natives/src/syscall/fs_js.go index d027d7be5..4a8ebe0ac 100644 --- a/compiler/natives/src/syscall/fs_js.go +++ b/compiler/natives/src/syscall/fs_js.go @@ -23,7 +23,7 @@ func fsCall(name string, args ...interface{}) (js.Value, error) { var res callResult if len(args) >= 1 { - if jsErr := args[0]; !jsErr.IsNull() { + if jsErr := args[0]; !jsErr.IsUndefined() && !jsErr.IsNull() { res.err = mapJSError(jsErr) } } From aad4eda9d7e114c720abd1b5a899028374b58bfa Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Sun, 15 May 2022 18:45:09 +0200 Subject: [PATCH 3/3] Add a comment to explain fsCall() safety checks --- compiler/natives/src/syscall/fs_js.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compiler/natives/src/syscall/fs_js.go b/compiler/natives/src/syscall/fs_js.go index 4a8ebe0ac..5a0a5a64d 100644 --- a/compiler/natives/src/syscall/fs_js.go +++ b/compiler/natives/src/syscall/fs_js.go @@ -22,6 +22,9 @@ func fsCall(name string, args ...interface{}) (js.Value, error) { f := js.FuncOf(func(this js.Value, args []js.Value) interface{} { var res callResult + // Check that args has at least one element, then check both IsUndefined() and IsNull() on + // that element. In some situations, BrowserFS calls the callback without arguments or with + // an undefined argument: https://github.com/gopherjs/gopherjs/pull/1118 if len(args) >= 1 { if jsErr := args[0]; !jsErr.IsUndefined() && !jsErr.IsNull() { res.err = mapJSError(jsErr)