Skip to content

Commit 16d95ef

Browse files
committedJul 28, 2021
fix possible exposing of collections elements metadata in some cases, close #427
1 parent be2c429 commit 16d95ef

File tree

7 files changed

+40
-6
lines changed

7 files changed

+40
-6
lines changed
 

‎CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- Work with symbols made stricter: some missed before case of methods that should throw error on symbols now works as they should
88
- Handling `@@toPrimitive` in some cases of `ToPrimitive` internal logic made stricter
99
- Fixed work of `Request` with polyfilled `URLSearchParams`, [#965](https://github.com/zloirock/core-js/issues/965)
10+
- Fixed possible exposing of collections elements metadata in some cases, [#427](https://github.com/zloirock/core-js/issues/427)
1011
- Fixed some cases of typed arrays subclassing logic
1112
- Fixed a minor bug related to string conversion in `RegExp#exec`
1213
- Fixed `Date.prototype.getYear` feature detection and compat data for IE8-

‎packages/core-js-pure/override/internals/collection.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ module.exports = function (CONSTRUCTOR_NAME, wrapper, common) {
3030
) {
3131
// create collection constructor
3232
Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);
33-
InternalMetadataModule.REQUIRED = true;
33+
InternalMetadataModule.enable();
3434
} else {
3535
Constructor = wrapper(function (target, iterable) {
3636
setInternalState(anInstance(target, Constructor, CONSTRUCTOR_NAME), {

‎packages/core-js/internals/collection.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ module.exports = function (CONSTRUCTOR_NAME, wrapper, common) {
5050
if (REPLACE) {
5151
// create collection constructor
5252
Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);
53-
InternalMetadataModule.REQUIRED = true;
53+
InternalMetadataModule.enable();
5454
} else if (isForced(CONSTRUCTOR_NAME, true)) {
5555
var instance = new Constructor();
5656
// early implementations not supports chaining

‎packages/core-js/internals/internal-metadata.js

+32-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
var $ = require('../internals/export');
12
var hiddenKeys = require('../internals/hidden-keys');
23
var isObject = require('../internals/is-object');
34
var has = require('../internals/has');
45
var defineProperty = require('../internals/object-define-property').f;
6+
var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');
7+
var getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external');
58
var uid = require('../internals/uid');
69
var FREEZING = require('../internals/freezing');
710

11+
var REQUIRED = false;
812
var METADATA = uid('meta');
913
var id = 0;
1014

@@ -48,12 +52,38 @@ var getWeakData = function (it, create) {
4852

4953
// add metadata on freeze-family methods calling
5054
var onFreeze = function (it) {
51-
if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);
55+
if (FREEZING && REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);
5256
return it;
5357
};
5458

59+
var enable = function () {
60+
meta.enable = function () { /* empty */ };
61+
REQUIRED = true;
62+
var getOwnPropertyNames = getOwnPropertyNamesModule.f;
63+
var splice = [].splice;
64+
var test = {};
65+
test[METADATA] = 1;
66+
67+
// prevent exposing of metadata key
68+
if (getOwnPropertyNames(test).length) {
69+
getOwnPropertyNamesModule.f = function (it) {
70+
var result = getOwnPropertyNames(it);
71+
for (var i = 0, length = result.length; i < length; i++) {
72+
if (result[i] === METADATA) {
73+
splice.call(result, i, 1);
74+
break;
75+
}
76+
} return result;
77+
};
78+
79+
$({ target: 'Object', stat: true, forced: true }, {
80+
getOwnPropertyNames: getOwnPropertyNamesExternalModule.f
81+
});
82+
}
83+
};
84+
5585
var meta = module.exports = {
56-
REQUIRED: false,
86+
enable: enable,
5787
fastKey: fastKey,
5888
getWeakData: getWeakData,
5989
onFreeze: onFreeze

‎packages/core-js/modules/es.weak-map.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);
2828
// https://github.com/zloirock/core-js/issues/485
2929
if (NATIVE_WEAK_MAP && IS_IE11) {
3030
InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);
31-
InternalMetadataModule.REQUIRED = true;
31+
InternalMetadataModule.enable();
3232
var WeakMapPrototype = $WeakMap.prototype;
3333
var nativeDelete = WeakMapPrototype['delete'];
3434
var nativeHas = WeakMapPrototype.has;

‎tests/pure/es.object.get-own-property-names.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { GLOBAL } from '../helpers/constants';
22
import { includes } from '../helpers/helpers';
33

4+
import freeze from 'core-js-pure/features/object/freeze';
45
import getOwnPropertyNames from 'core-js-pure/features/object/get-own-property-names';
56

67
QUnit.test('Object.getOwnPropertyNames', assert => {
@@ -24,6 +25,7 @@ QUnit.test('Object.getOwnPropertyNames', assert => {
2425
assert.ok(includes(getOwnPropertyNames(Array.prototype), 'toString'));
2526
assert.ok(includes(getOwnPropertyNames(Object.prototype), 'toString'));
2627
assert.ok(includes(getOwnPropertyNames(Object.prototype), 'constructor'));
28+
assert.deepEqual(getOwnPropertyNames(freeze({})), [], 'frozen');
2729
const primitives = [42, 'foo', false];
2830
for (const value of primitives) {
2931
assert.notThrows(() => getOwnPropertyNames(value), `accept ${ typeof value }`);

‎tests/tests/es.object.get-own-property-names.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { GLOBAL } from '../helpers/constants';
22
import { includes } from '../helpers/helpers';
33

44
QUnit.test('Object.getOwnPropertyNames', assert => {
5-
const { getOwnPropertyNames } = Object;
5+
const { freeze, getOwnPropertyNames } = Object;
66
assert.isFunction(getOwnPropertyNames);
77
assert.arity(getOwnPropertyNames, 1);
88
assert.name(getOwnPropertyNames, 'getOwnPropertyNames');
@@ -26,6 +26,7 @@ QUnit.test('Object.getOwnPropertyNames', assert => {
2626
assert.ok(includes(getOwnPropertyNames(Array.prototype), 'toString'));
2727
assert.ok(includes(getOwnPropertyNames(Object.prototype), 'toString'));
2828
assert.ok(includes(getOwnPropertyNames(Object.prototype), 'constructor'));
29+
assert.deepEqual(getOwnPropertyNames(freeze({})), [], 'frozen');
2930
const primitives = [42, 'foo', false];
3031
for (const value of primitives) {
3132
assert.notThrows(() => getOwnPropertyNames(value), `accept ${ typeof value }`);

0 commit comments

Comments
 (0)
Please sign in to comment.