Skip to content

Commit ee83663

Browse files
committed
Serialize vars early to avoid living references
1 parent 5529c70 commit ee83663

File tree

4 files changed

+30
-5
lines changed

4 files changed

+30
-5
lines changed

sentry_sdk/client.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from sentry_sdk.utils import (
1111
capture_internal_exceptions,
1212
current_stacktrace,
13-
disable_capture_event,
1413
format_timestamp,
1514
get_sdk_name,
1615
get_type_name,
@@ -726,9 +725,6 @@ def capture_event(
726725
727726
:returns: An event ID. May be `None` if there is no DSN set or of if the SDK decided to discard the event for other reasons. In such situations setting `debug=True` on `init()` may help.
728727
"""
729-
if disable_capture_event.get(False):
730-
return None
731-
732728
if hint is None:
733729
hint = {}
734730
event_id = event.get("event_id")

sentry_sdk/scope.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
capture_internal_exception,
3232
capture_internal_exceptions,
3333
ContextVar,
34+
disable_capture_event,
3435
event_from_exception,
3536
exc_info_from_error,
3637
logger,
@@ -1130,6 +1131,9 @@ def capture_event(self, event, hint=None, scope=None, **scope_kwargs):
11301131
11311132
:returns: An `event_id` if the SDK decided to send the event (see :py:meth:`sentry_sdk.client._Client.capture_event`).
11321133
"""
1134+
if disable_capture_event.get(False):
1135+
return None
1136+
11331137
scope = self._merge_scopes(scope, scope_kwargs)
11341138

11351139
event_id = self.get_client().capture_event(event=event, hint=hint, scope=scope)
@@ -1157,6 +1161,9 @@ def capture_message(self, message, level=None, scope=None, **scope_kwargs):
11571161
11581162
:returns: An `event_id` if the SDK decided to send the event (see :py:meth:`sentry_sdk.client._Client.capture_event`).
11591163
"""
1164+
if disable_capture_event.get(False):
1165+
return None
1166+
11601167
if level is None:
11611168
level = "info"
11621169

@@ -1182,6 +1189,9 @@ def capture_exception(self, error=None, scope=None, **scope_kwargs):
11821189
11831190
:returns: An `event_id` if the SDK decided to send the event (see :py:meth:`sentry_sdk.client._Client.capture_event`).
11841191
"""
1192+
if disable_capture_event.get(False):
1193+
return None
1194+
11851195
if error is not None:
11861196
exc_info = exc_info_from_error(error)
11871197
else:

sentry_sdk/utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,9 @@ def serialize_frame(
616616
)
617617

618618
if include_local_variables:
619-
rv["vars"] = frame.f_locals.copy()
619+
from sentry_sdk.serializer import serialize
620+
621+
rv["vars"] = serialize(frame.f_locals)
620622

621623
return rv
622624

tests/test_scrubber.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,3 +187,20 @@ def test_recursive_event_scrubber(sentry_init, capture_events):
187187

188188
(event,) = events
189189
assert event["extra"]["deep"]["deeper"][0]["deepest"]["password"] == "'[Filtered]'"
190+
191+
192+
def test_recursive_scrubber_does_not_override_original(sentry_init, capture_events):
193+
sentry_init(event_scrubber=EventScrubber(recursive=True))
194+
events = capture_events()
195+
196+
data = {"csrf": "secret"}
197+
try:
198+
raise RuntimeError("An error")
199+
except Exception:
200+
capture_exception()
201+
202+
(event,) = events
203+
frames = event["exception"]["values"][0]["stacktrace"]["frames"]
204+
(frame,) = frames
205+
assert data["csrf"] == "secret"
206+
assert frame["vars"]["data"]["csrf"] == "[Filtered]"

0 commit comments

Comments
 (0)