Skip to content

Commit 1c63734

Browse files
gh-91348: Restore frame argument to sys._getframe audit event (GH-94928)
(cherry picked from commit 044a593) Co-authored-by: Steve Dower <[email protected]>
1 parent 65d87a2 commit 1c63734

File tree

4 files changed

+31
-6
lines changed

4 files changed

+31
-6
lines changed

Doc/library/sys.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,7 @@ always available.
774774
that is deeper than the call stack, :exc:`ValueError` is raised. The default
775775
for *depth* is zero, returning the frame at the top of the call stack.
776776

777-
.. audit-event:: sys._getframe "" sys._getframe
777+
.. audit-event:: sys._getframe frame sys._getframe
778778

779779
.. impl-detail::
780780

Lib/test/audit-tests.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,17 @@ def hook(event, *args):
408408
raise RuntimeError("Expected sqlite3.load_extension to fail")
409409

410410

411+
def test_sys_getframe():
412+
import sys
413+
414+
def hook(event, args):
415+
if event.startswith("sys."):
416+
print(event, args[0].f_code.co_name)
417+
418+
sys.addaudithook(hook)
419+
sys._getframe()
420+
421+
411422
if __name__ == "__main__":
412423
from test.support import suppress_msvcrt_asserts
413424

Lib/test/test_audit.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,5 +176,17 @@ def test_sqlite3(self):
176176
self.assertEqual(actual, expected)
177177

178178

179+
def test_sys_getframe(self):
180+
returncode, events, stderr = self.run_python("test_sys_getframe")
181+
if returncode:
182+
self.fail(stderr)
183+
184+
if support.verbose:
185+
print(*events, sep='\n')
186+
actual = [(ev[0], ev[2]) for ev in events]
187+
expected = [("sys._getframe", "test_sys_getframe")]
188+
189+
self.assertEqual(actual, expected)
190+
179191
if __name__ == "__main__":
180192
unittest.main()

Python/sysmodule.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,10 +1780,6 @@ sys__getframe_impl(PyObject *module, int depth)
17801780
PyThreadState *tstate = _PyThreadState_GET();
17811781
_PyInterpreterFrame *frame = tstate->cframe->current_frame;
17821782

1783-
if (_PySys_Audit(tstate, "sys._getframe", NULL) < 0) {
1784-
return NULL;
1785-
}
1786-
17871783
if (frame != NULL) {
17881784
while (depth > 0) {
17891785
frame = frame->previous;
@@ -1801,7 +1797,13 @@ sys__getframe_impl(PyObject *module, int depth)
18011797
"call stack is not deep enough");
18021798
return NULL;
18031799
}
1804-
return _Py_XNewRef((PyObject *)_PyFrame_GetFrameObject(frame));
1800+
1801+
PyObject *pyFrame = Py_XNewRef((PyObject *)_PyFrame_GetFrameObject(frame));
1802+
if (pyFrame && _PySys_Audit(tstate, "sys._getframe", "(O)", pyFrame) < 0) {
1803+
Py_DECREF(pyFrame);
1804+
return NULL;
1805+
}
1806+
return pyFrame;
18051807
}
18061808

18071809
/*[clinic input]

0 commit comments

Comments
 (0)