diff --git a/packages/opentelemetry-core/src/utils/deep-merge.ts b/packages/opentelemetry-core/src/utils/deep-merge.ts index 8a57b84c9c..d40dc30f3e 100644 --- a/packages/opentelemetry-core/src/utils/deep-merge.ts +++ b/packages/opentelemetry-core/src/utils/deep-merge.ts @@ -15,15 +15,19 @@ */ export function deepMerge( target: Record, - source: Record + source: Record, + maxDepth = 10 ) { const merged = target; + if (maxDepth === 0) { + throw new Error('Max depth exceeded.'); + } for (const prop in source) { if (bothPropsAreArrays(target, source, prop)) { merged[prop] = []; merged[prop] = source[prop]; } else if (bothPropsAreObjects(target, source, prop)) { - merged[prop] = deepMerge(target[prop], source[prop]); + merged[prop] = deepMerge(target[prop], source[prop], maxDepth - 1); } else { merged[prop] = source[prop]; } diff --git a/packages/opentelemetry-core/test/utils/deep-merge.test.ts b/packages/opentelemetry-core/test/utils/deep-merge.test.ts index 0effda00f8..8c97371a43 100644 --- a/packages/opentelemetry-core/test/utils/deep-merge.test.ts +++ b/packages/opentelemetry-core/test/utils/deep-merge.test.ts @@ -67,4 +67,14 @@ describe('deepMerge', () => { const merged = deepMerge(target, source); assert.deepEqual(merged, expected); }); + + it('should respect the max depth', () => { + assert.throws(() => { + deepMerge( + { a: { a: { a: { a: { a: { a: 1 } } } } } }, + { a: { a: { a: { a: { a: { a: 1 } } } } } }, + 5 + ); + }); + }); });