From 7f6670ff4ae67e06d17d517e2c848385b4a0ded7 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sun, 28 Nov 2021 15:18:08 +0700 Subject: [PATCH] prevent some theoretical cases of breaking / observing the internal state by patching `Array.prototype[@@species]` --- CHANGELOG.md | 1 + packages/core-js/internals/array-buffer.js | 2 +- .../core-js/internals/array-slice-simple.js | 17 +++++++++++++++++ packages/core-js/internals/array-sort.js | 2 +- packages/core-js/internals/clear-error-stack.js | 2 +- .../object-get-own-property-names-external.js | 2 +- packages/core-js/modules/es.string.split.js | 2 +- packages/core-js/modules/web.url.js | 2 +- 8 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 packages/core-js/internals/array-slice-simple.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 0340c5adad4e..243d1efad1ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ##### Unreleased - Added a workaround for a UC Browser specific version bug with unobservable `RegExp#sticky` flag, [#1008](https://github.com/zloirock/core-js/issues/1008), [#1015](https://github.com/zloirock/core-js/issues/1015) - Added handling of comments and specific spaces to `Function#name` polyfill, [#1010](https://github.com/zloirock/core-js/issues/1010), thanks [@ildar-shaimordanov](https://github.com/ildar-shaimordanov) +- Prevented some theoretical cases of breaking / observing the internal state by patching `Array.prototype[@@species]` - Added iOS Safari 15.2 compat data mapping - Added Electron 17.0 compat data mapping - Updated Deno compat data mapping diff --git a/packages/core-js/internals/array-buffer.js b/packages/core-js/internals/array-buffer.js index 35ad67060b14..0fa2146f880f 100644 --- a/packages/core-js/internals/array-buffer.js +++ b/packages/core-js/internals/array-buffer.js @@ -17,7 +17,7 @@ var setPrototypeOf = require('../internals/object-set-prototype-of'); var getOwnPropertyNames = require('../internals/object-get-own-property-names').f; var defineProperty = require('../internals/object-define-property').f; var arrayFill = require('../internals/array-fill'); -var arraySlice = require('../internals/array-slice'); +var arraySlice = require('../internals/array-slice-simple'); var setToStringTag = require('../internals/set-to-string-tag'); var InternalStateModule = require('../internals/internal-state'); diff --git a/packages/core-js/internals/array-slice-simple.js b/packages/core-js/internals/array-slice-simple.js new file mode 100644 index 000000000000..738d64447cd2 --- /dev/null +++ b/packages/core-js/internals/array-slice-simple.js @@ -0,0 +1,17 @@ +var global = require('../internals/global'); +var toAbsoluteIndex = require('../internals/to-absolute-index'); +var lengthOfArrayLike = require('../internals/length-of-array-like'); +var createProperty = require('../internals/create-property'); + +var Array = global.Array; +var max = Math.max; + +module.exports = function (O, start, end) { + var length = lengthOfArrayLike(O); + var k = toAbsoluteIndex(start, length); + var fin = toAbsoluteIndex(end === undefined ? length : end, length); + var result = Array(max(fin - k, 0)); + for (var n = 0; k < fin; k++, n++) createProperty(result, n, O[k]); + result.length = n; + return result; +}; diff --git a/packages/core-js/internals/array-sort.js b/packages/core-js/internals/array-sort.js index 25551775d3d5..dc6db4d19b6e 100644 --- a/packages/core-js/internals/array-sort.js +++ b/packages/core-js/internals/array-sort.js @@ -1,4 +1,4 @@ -var arraySlice = require('../internals/array-slice'); +var arraySlice = require('../internals/array-slice-simple'); var floor = Math.floor; diff --git a/packages/core-js/internals/clear-error-stack.js b/packages/core-js/internals/clear-error-stack.js index 5c1546f74699..167a7a721a38 100644 --- a/packages/core-js/internals/clear-error-stack.js +++ b/packages/core-js/internals/clear-error-stack.js @@ -1,5 +1,5 @@ var uncurryThis = require('../internals/function-uncurry-this'); -var arraySlice = require('../internals/array-slice'); +var arraySlice = require('../internals/array-slice-simple'); var replace = uncurryThis(''.replace); var split = uncurryThis(''.split); diff --git a/packages/core-js/internals/object-get-own-property-names-external.js b/packages/core-js/internals/object-get-own-property-names-external.js index ebc61d829343..32d2b73ffe53 100644 --- a/packages/core-js/internals/object-get-own-property-names-external.js +++ b/packages/core-js/internals/object-get-own-property-names-external.js @@ -2,7 +2,7 @@ var classof = require('../internals/classof-raw'); var toIndexedObject = require('../internals/to-indexed-object'); var $getOwnPropertyNames = require('../internals/object-get-own-property-names').f; -var arraySlice = require('../internals/array-slice'); +var arraySlice = require('../internals/array-slice-simple'); var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; diff --git a/packages/core-js/modules/es.string.split.js b/packages/core-js/modules/es.string.split.js index 47fc7b9707ee..849f4e2da264 100644 --- a/packages/core-js/modules/es.string.split.js +++ b/packages/core-js/modules/es.string.split.js @@ -11,7 +11,7 @@ var advanceStringIndex = require('../internals/advance-string-index'); var toLength = require('../internals/to-length'); var toString = require('../internals/to-string'); var getMethod = require('../internals/get-method'); -var arraySlice = require('../internals/array-slice'); +var arraySlice = require('../internals/array-slice-simple'); var callRegExpExec = require('../internals/regexp-exec-abstract'); var regexpExec = require('../internals/regexp-exec'); var stickyHelpers = require('../internals/regexp-sticky-helpers'); diff --git a/packages/core-js/modules/web.url.js b/packages/core-js/modules/web.url.js index 8fee67c7d558..86ca3429f5c0 100644 --- a/packages/core-js/modules/web.url.js +++ b/packages/core-js/modules/web.url.js @@ -14,7 +14,7 @@ var anInstance = require('../internals/an-instance'); var hasOwn = require('../internals/has-own-property'); var assign = require('../internals/object-assign'); var arrayFrom = require('../internals/array-from'); -var arraySlice = require('../internals/array-slice'); +var arraySlice = require('../internals/array-slice-simple'); var codeAt = require('../internals/string-multibyte').codeAt; var toASCII = require('../internals/string-punycode-to-ascii'); var $toString = require('../internals/to-string');