From d42a94a6b66751b8193c46d4be05b67136c48404 Mon Sep 17 00:00:00 2001 From: devteamaegis Date: Thu, 4 Jun 2026 14:03:14 -0400 Subject: [PATCH 1/2] fix(utils): handle empty string in match_regex_list --- sentry_sdk/utils.py | 2 +- tests/test_utils.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index 875d28c0d0..41eef5c35f 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1740,7 +1740,7 @@ def match_regex_list( return False for item_matcher in regex_list: - if not substring_matching and item_matcher[-1] != "$": + if not substring_matching and (not item_matcher or item_matcher[-1] != "$"): item_matcher += "$" matched = re.search(item_matcher, item) diff --git a/tests/test_utils.py b/tests/test_utils.py index 718cdbaa1d..4a5b7235c2 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -562,6 +562,14 @@ def test_match_regex_list(item, regex_list, expected_result): assert match_regex_list(item, regex_list) == expected_result +def test_match_regex_list_empty_string_pattern(): + # An empty-string pattern must not raise IndexError (regression test). + result = match_regex_list("anything", [""]) + assert isinstance(result, bool) + assert match_regex_list("foobar", ["foo"]) is False + assert match_regex_list("foo", ["foo"]) is True + + @pytest.mark.parametrize( "version,expected_result", [ From 27447a429b08a57a59fc6097f87bd9fc401de260 Mon Sep 17 00:00:00 2001 From: devteamaegis Date: Sat, 13 Jun 2026 15:22:48 -0400 Subject: [PATCH 2/2] fix(utils): treat empty-string pattern like empty list in match_regex_list Address review feedback: an empty string in regex_list represents a typo/mistake and should be treated as if [] was passed, returning False rather than matching every item. Fold the regression case into the parameterized test_match_regex_list cases and drop the redundant standalone test. --- sentry_sdk/utils.py | 5 ++++- tests/test_utils.py | 9 +-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index 41eef5c35f..49ee719582 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1740,7 +1740,10 @@ def match_regex_list( return False for item_matcher in regex_list: - if not substring_matching and (not item_matcher or item_matcher[-1] != "$"): + if not item_matcher: + return False + + if not substring_matching and item_matcher[-1] != "$": item_matcher += "$" matched = re.search(item_matcher, item) diff --git a/tests/test_utils.py b/tests/test_utils.py index 4a5b7235c2..530d6ab41a 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -556,20 +556,13 @@ def test_include_source_context_when_serializing_frame(include_source_context): ["some-string", ["some.*"], True], ["some-string", ["Some"], False], # we do case sensitive matching ["some-string", [".*string$"], True], + ["some-string", [""], False], # an empty-string pattern is treated like [] ], ) def test_match_regex_list(item, regex_list, expected_result): assert match_regex_list(item, regex_list) == expected_result -def test_match_regex_list_empty_string_pattern(): - # An empty-string pattern must not raise IndexError (regression test). - result = match_regex_list("anything", [""]) - assert isinstance(result, bool) - assert match_regex_list("foobar", ["foo"]) is False - assert match_regex_list("foo", ["foo"]) is True - - @pytest.mark.parametrize( "version,expected_result", [