Browse Source

fix: use non-symbols in isURLInstance check (#24861)

* fix: use non-symbols in isURLInstance check

* update patches

* update patches

* update patches

* update patches

Co-authored-by: Shelley Vohr <[email protected]>
Co-authored-by: Electron Bot <[email protected]>
trop[bot] 4 years ago
parent
commit
0e7e4fef29

+ 1 - 0
patches/node/.patches

@@ -51,3 +51,4 @@ crypto_update_root_certificates_to_nss_3_47.patch
 tools_update_certdata_txt_to_nss_3_53.patch
 crypto_update_root_certificates_to_nss_3_53.patch
 darwin_work_around_clock_jumping_back_in_time.patch
+lib_use_non-symbols_in_isurlinstance_check.patch

+ 39 - 0
patches/node/lib_use_non-symbols_in_isurlinstance_check.patch

@@ -0,0 +1,39 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Shelley Vohr <[email protected]>
+Date: Tue, 4 Aug 2020 09:17:06 -0700
+Subject: lib: use non-symbols in isURLInstance check
+
+This slightly changes the conditional used to determine whether or
+not something is a URL instance. Since Node.js adds symbols to the URL
+not specified by the WHATWG, those symbols are not present in other
+implementations (like Blink's) and therefore can cause false negatives.
+
+This fixes that by slightly changing the check to properties present
+in all URL instances as specified in the WHATWG spec.
+
+Upstreamed at: https://github.com/nodejs/node/pull/34622.
+
+diff --git a/lib/internal/url.js b/lib/internal/url.js
+index fde643bea370c86d8a7e7f17ae8aa12894028abf..a39ba02d6f4cfaa1ca2325366cd52f50b8dbfbe7 100644
+--- a/lib/internal/url.js
++++ b/lib/internal/url.js
+@@ -1334,8 +1334,7 @@ function getPathFromURLPosix(url) {
+ function fileURLToPath(path) {
+   if (typeof path === 'string')
+     path = new URL(path);
+-  else if (path == null || !path[searchParams] ||
+-           !path[searchParams][searchParams])
++  else if (path == null || !path['origin'] || !path['href'])
+     throw new ERR_INVALID_ARG_TYPE('path', ['string', 'URL'], path);
+   if (path.protocol !== 'file:')
+     throw new ERR_INVALID_URL_SCHEME('file');
+@@ -1383,8 +1382,7 @@ function pathToFileURL(filepath) {
+ }
+ 
+ function toPathIfFileURL(fileURLOrPath) {
+-  if (fileURLOrPath == null || !fileURLOrPath[searchParams] ||
+-      !fileURLOrPath[searchParams][searchParams])
++  if (fileURLOrPath == null || !fileURLOrPath['origin'] || !fileURLOrPath['href'])
+     return fileURLOrPath;
+   return fileURLToPath(fileURLOrPath);
+ }

+ 9 - 0
spec/node-spec.js

@@ -191,6 +191,15 @@ describe('node feature', () => {
       });
     });
 
+    describe('URL handling in the renderer process', () => {
+      it('can successfully handle WHATWG URLs constructed by Blink', () => {
+        const url = new URL('file://' + path.resolve(fixtures, 'pages', 'base-page.html'));
+        expect(() => {
+          fs.createReadStream(url);
+        }).to.not.throw();
+      });
+    });
+
     describe('error thrown in main process node context', () => {
       it('gets emitted as a process uncaughtException event', () => {
         const error = ipcRenderer.sendSync('handle-uncaught-exception', 'hello');