diff --git a/lib/browser/objects-registry.js b/lib/browser/objects-registry.js index 1917c65e6558..aeaf5351dc00 100644 --- a/lib/browser/objects-registry.js +++ b/lib/browser/objects-registry.js @@ -41,7 +41,8 @@ class ObjectsRegistry { // Get an object according to its ID. get (id) { - return this.storage[id].object + const pointer = this.storage[id] + if (pointer != null) return pointer.object } // Dereference an object according to its ID. diff --git a/lib/browser/rpc-server.js b/lib/browser/rpc-server.js index e3f731c97848..03eed56de911 100644 --- a/lib/browser/rpc-server.js +++ b/lib/browser/rpc-server.js @@ -139,6 +139,12 @@ const exceptionToMeta = function (error) { } } +const throwRPCError = function (message) { + const error = new Error(message) + error.code = 'EBADRPC' + throw error +} + // Convert array of meta data from renderer into array of real values. const unwrapArgs = function (sender, args) { const metaToValue = function (meta) { @@ -277,6 +283,10 @@ ipcMain.on('ELECTRON_BROWSER_CONSTRUCTOR', function (event, id, args) { args = unwrapArgs(event.sender, args) let constructor = objectsRegistry.get(id) + if (constructor == null) { + throwRPCError(`Cannot call constructor on missing remote object ${id}`) + } + // Call new with array of arguments. // http://stackoverflow.com/questions/1606797/use-of-apply-with-new-operator-is-this-possible let obj = new (Function.prototype.bind.apply(constructor, [null].concat(args)))() @@ -290,6 +300,11 @@ ipcMain.on('ELECTRON_BROWSER_FUNCTION_CALL', function (event, id, args) { try { args = unwrapArgs(event.sender, args) let func = objectsRegistry.get(id) + + if (func == null) { + throwRPCError(`Cannot call function on missing remote object ${id}`) + } + callFunction(event, func, global, args) } catch (error) { event.returnValue = exceptionToMeta(error) @@ -299,9 +314,14 @@ ipcMain.on('ELECTRON_BROWSER_FUNCTION_CALL', function (event, id, args) { ipcMain.on('ELECTRON_BROWSER_MEMBER_CONSTRUCTOR', function (event, id, method, args) { try { args = unwrapArgs(event.sender, args) - let constructor = objectsRegistry.get(id)[method] + let object = objectsRegistry.get(id) + + if (object == null) { + throwRPCError(`Cannot call constructor '${method}' on missing remote object ${id}`) + } // Call new with array of arguments. + let constructor = object[method] let obj = new (Function.prototype.bind.apply(constructor, [null].concat(args)))() event.returnValue = valueToMeta(event.sender, obj) } catch (error) { @@ -313,6 +333,11 @@ ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) { try { args = unwrapArgs(event.sender, args) let obj = objectsRegistry.get(id) + + if (obj == null) { + throwRPCError(`Cannot call function '${method}' on missing remote object ${id}`) + } + callFunction(event, obj[method], obj, args) } catch (error) { event.returnValue = exceptionToMeta(error) @@ -322,6 +347,11 @@ ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) { ipcMain.on('ELECTRON_BROWSER_MEMBER_SET', function (event, id, name, value) { try { let obj = objectsRegistry.get(id) + + if (obj == null) { + throwRPCError(`Cannot set property '${name}' on missing remote object ${id}`) + } + obj[name] = value event.returnValue = null } catch (error) {