From d1bed02e0a3d573bcf9d21fcd5dd203ab5e99ef8 Mon Sep 17 00:00:00 2001 From: wangzlei Date: Wed, 1 Oct 2025 11:57:11 -0700 Subject: [PATCH 1/2] fix stack overflow if metadata contains circular reference --- aws_xray_sdk/core/utils/conversion.py | 5 +++-- tests/util.py | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/aws_xray_sdk/core/utils/conversion.py b/aws_xray_sdk/core/utils/conversion.py index 1c039310..465677d6 100644 --- a/aws_xray_sdk/core/utils/conversion.py +++ b/aws_xray_sdk/core/utils/conversion.py @@ -30,6 +30,7 @@ def metadata_to_dict(obj): return metadata else: return obj - except Exception: - log.exception("Failed to convert metadata to dict") + except Exception as e: + import pprint + log.info("Failed to convert metadata to dict:\n%s", pprint.pformat(getattr(e, "args", None))) return {} diff --git a/tests/util.py b/tests/util.py index d5f51d12..7c847b0f 100644 --- a/tests/util.py +++ b/tests/util.py @@ -4,6 +4,14 @@ from aws_xray_sdk.core.recorder import AWSXRayRecorder from aws_xray_sdk.core.emitters.udp_emitter import UDPEmitter from aws_xray_sdk.core.sampling.sampler import DefaultSampler +from aws_xray_sdk.core.utils.conversion import metadata_to_dict + + +class CircularReferenceClass: + """Test class that can create circular references""" + def __init__(self, name): + self.name = name + self.ref = None class StubbedEmitter(UDPEmitter): @@ -99,3 +107,15 @@ def _search_entity_by_annotation(entity, key, value): if result is not None: return result return None + + +def test_metadata_to_dict_self_reference(): + """Test that self-referencing objects don't cause stack overflow""" + obj = CircularReferenceClass("self_ref") + obj.ref = obj # Self reference + + # This should not cause stack overflow + result = metadata_to_dict(obj) + + # The function should handle the self reference gracefully + assert isinstance(result, dict) From d80f1371ca5e5375cbdefedcdc2637d838d64bbb Mon Sep 17 00:00:00 2001 From: wangzlei Date: Thu, 2 Oct 2025 10:34:54 -0700 Subject: [PATCH 2/2] change log level to warning --- aws_xray_sdk/core/utils/conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_xray_sdk/core/utils/conversion.py b/aws_xray_sdk/core/utils/conversion.py index 465677d6..0f15430f 100644 --- a/aws_xray_sdk/core/utils/conversion.py +++ b/aws_xray_sdk/core/utils/conversion.py @@ -32,5 +32,5 @@ def metadata_to_dict(obj): return obj except Exception as e: import pprint - log.info("Failed to convert metadata to dict:\n%s", pprint.pformat(getattr(e, "args", None))) + log.warning("Failed to convert metadata to dict:\n%s", pprint.pformat(getattr(e, "args", None))) return {}