Browse Source

fix: validate sender for replies in ipcMainInternalUtils.invokeInWebContents() (#17416)

Milan Burda 6 years ago
parent
commit
cbd884060e
1 changed files with 11 additions and 3 deletions
  1. 11 3
      lib/browser/ipc-main-internal-utils.ts

+ 11 - 3
lib/browser/ipc-main-internal-utils.ts

@@ -29,9 +29,17 @@ let nextId = 0
 export function invokeInWebContents<T> (sender: Electron.WebContentsInternal, command: string, ...args: any[]) {
   return new Promise<T>((resolve, reject) => {
     const requestId = ++nextId
-    ipcMainInternal.once(`${command}_RESPONSE_${requestId}`, (
-      _event, error: Electron.SerializedError, result: any
-    ) => {
+    const channel = `${command}_RESPONSE_${requestId}`
+    ipcMainInternal.on(channel, function handler (
+      event, error: Electron.SerializedError, result: any
+    ) {
+      if (event.sender !== sender) {
+        console.error(`Reply to ${command} sent by unexpected WebContents (${event.sender.id})`)
+        return
+      }
+
+      ipcMainInternal.removeListener(channel, handler)
+
       if (error) {
         reject(errorUtils.deserialize(error))
       } else {