Skip to content

Commit 1e66739

Browse files
committedDec 14, 2023
Fix stack overflow crash in isProviderFor
1 parent 68fd019 commit 1e66739

File tree

4 files changed

+33
-18
lines changed

4 files changed

+33
-18
lines changed
 

‎Reflect.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -1745,14 +1745,15 @@ namespace Reflect {
17451745
}
17461746

17471747
function CreateFallbackProvider(reflect: typeof Reflect): MetadataProvider {
1748+
const { defineMetadata, hasOwnMetadata, getOwnMetadata, getOwnMetadataKeys, deleteMetadata } = reflect;
17481749
const metadataOwner = new _WeakMap<object, Set<string | symbol | undefined>>();
17491750
const provider: MetadataProvider = {
17501751
isProviderFor(O, P) {
17511752
let metadataPropertySet = metadataOwner.get(O);
17521753
if (!IsUndefined(metadataPropertySet)) {
17531754
return metadataPropertySet.has(P);
17541755
}
1755-
if (reflect.getOwnMetadataKeys(O, P!).length) {
1756+
if (getOwnMetadataKeys(O, P!).length) {
17561757
if (IsUndefined(metadataPropertySet)) {
17571758
metadataPropertySet = new _Set();
17581759
metadataOwner.set(O, metadataPropertySet);
@@ -1762,11 +1763,11 @@ namespace Reflect {
17621763
}
17631764
return false;
17641765
},
1765-
OrdinaryDefineOwnMetadata: reflect.defineMetadata,
1766-
OrdinaryHasOwnMetadata: reflect.hasOwnMetadata,
1767-
OrdinaryGetOwnMetadata: reflect.getOwnMetadata,
1768-
OrdinaryOwnMetadataKeys: reflect.getOwnMetadataKeys,
1769-
OrdinaryDeleteMetadata: reflect.deleteMetadata,
1766+
OrdinaryDefineOwnMetadata: defineMetadata,
1767+
OrdinaryHasOwnMetadata: hasOwnMetadata,
1768+
OrdinaryGetOwnMetadata: getOwnMetadata,
1769+
OrdinaryOwnMetadataKeys: getOwnMetadataKeys,
1770+
OrdinaryDeleteMetadata: deleteMetadata,
17701771
};
17711772
return provider;
17721773
}

‎ReflectLite.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -1705,14 +1705,15 @@ namespace Reflect {
17051705
}
17061706

17071707
function CreateFallbackProvider(reflect: typeof Reflect): MetadataProvider {
1708+
const { defineMetadata, hasOwnMetadata, getOwnMetadata, getOwnMetadataKeys, deleteMetadata } = reflect;
17081709
const metadataOwner = new _WeakMap<object, Set<string | symbol | undefined>>();
17091710
const provider: MetadataProvider = {
17101711
isProviderFor(O, P) {
17111712
let metadataPropertySet = metadataOwner.get(O);
17121713
if (!IsUndefined(metadataPropertySet)) {
17131714
return metadataPropertySet.has(P);
17141715
}
1715-
if (reflect.getOwnMetadataKeys(O, P!).length) {
1716+
if (getOwnMetadataKeys(O, P!).length) {
17161717
if (IsUndefined(metadataPropertySet)) {
17171718
metadataPropertySet = new _Set();
17181719
metadataOwner.set(O, metadataPropertySet);
@@ -1722,11 +1723,11 @@ namespace Reflect {
17221723
}
17231724
return false;
17241725
},
1725-
OrdinaryDefineOwnMetadata: reflect.defineMetadata,
1726-
OrdinaryHasOwnMetadata: reflect.hasOwnMetadata,
1727-
OrdinaryGetOwnMetadata: reflect.getOwnMetadata,
1728-
OrdinaryOwnMetadataKeys: reflect.getOwnMetadataKeys,
1729-
OrdinaryDeleteMetadata: reflect.deleteMetadata,
1726+
OrdinaryDefineOwnMetadata: defineMetadata,
1727+
OrdinaryHasOwnMetadata: hasOwnMetadata,
1728+
OrdinaryGetOwnMetadata: getOwnMetadata,
1729+
OrdinaryOwnMetadataKeys: getOwnMetadataKeys,
1730+
OrdinaryDeleteMetadata: deleteMetadata,
17301731
};
17311732
return provider;
17321733
}

‎ReflectNoConflict.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -1582,14 +1582,15 @@ function CreateMetadataProvider(registry: MetadataRegistry): MetadataProvider {
15821582
}
15831583

15841584
function CreateFallbackProvider(reflect: typeof Reflect): MetadataProvider {
1585+
const { defineMetadata, hasOwnMetadata, getOwnMetadata, getOwnMetadataKeys, deleteMetadata } = reflect;
15851586
const metadataOwner = new _WeakMap<object, Set<string | symbol | undefined>>();
15861587
const provider: MetadataProvider = {
15871588
isProviderFor(O, P) {
15881589
let metadataPropertySet = metadataOwner.get(O);
15891590
if (!IsUndefined(metadataPropertySet)) {
15901591
return metadataPropertySet.has(P);
15911592
}
1592-
if (reflect.getOwnMetadataKeys(O, P!).length) {
1593+
if (getOwnMetadataKeys(O, P!).length) {
15931594
if (IsUndefined(metadataPropertySet)) {
15941595
metadataPropertySet = new _Set();
15951596
metadataOwner.set(O, metadataPropertySet);
@@ -1599,11 +1600,11 @@ function CreateFallbackProvider(reflect: typeof Reflect): MetadataProvider {
15991600
}
16001601
return false;
16011602
},
1602-
OrdinaryDefineOwnMetadata: reflect.defineMetadata,
1603-
OrdinaryHasOwnMetadata: reflect.hasOwnMetadata,
1604-
OrdinaryGetOwnMetadata: reflect.getOwnMetadata,
1605-
OrdinaryOwnMetadataKeys: reflect.getOwnMetadataKeys,
1606-
OrdinaryDeleteMetadata: reflect.deleteMetadata,
1603+
OrdinaryDefineOwnMetadata: defineMetadata,
1604+
OrdinaryHasOwnMetadata: hasOwnMetadata,
1605+
OrdinaryGetOwnMetadata: getOwnMetadata,
1606+
OrdinaryOwnMetadataKeys: getOwnMetadataKeys,
1607+
OrdinaryDeleteMetadata: deleteMetadata,
16071608
};
16081609
return provider;
16091610
}

‎test/reflect-other.ts

+12
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,17 @@ for (const { name, header, context } of suites.filter(s => s.global)) {
2525
assert.strictEqual(Reflect.getOwnMetadata("key", obj), "value");
2626
});
2727
});
28+
29+
it("isProviderFor crash", () => {
30+
const { Reflect } = script(context)`
31+
Reflect.defineMetadata = function() {};
32+
Reflect.getOwnMetadataKeys = function() { return [] };
33+
Reflect.getMetadataKeys = function() { return []; }
34+
${header}
35+
exports.Reflect = Reflect;
36+
`;
37+
let obj = {};
38+
Reflect.getMetadataKeys(obj);
39+
});
2840
});
2941
}

0 commit comments

Comments
 (0)
Please sign in to comment.