https://github.com/python/cpython/commit/bfcd5f25a55443103a64dd8af5624c84df02c5e4
commit: bfcd5f25a55443103a64dd8af5624c84df02c5e4
branch: 3.14
author: Miss Islington (bot) <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2025-10-07T18:06:45Z
summary:

[3.14] gh-138661: fix data race in `PyCode_Addr2Line` (GH-138664) (#138834)

gh-138661: fix data race in `PyCode_Addr2Line` (GH-138664)
(cherry picked from commit ea26f6da39294b7d3c28873d070a2218bd528b5f)

Co-authored-by: Kumar Aditya <[email protected]>

files:
M Include/internal/pycore_code.h
M Objects/codeobject.c
M Python/traceback.c

diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h
index 37a747aa4e3e46..43286774eb2c71 100644
--- a/Include/internal/pycore_code.h
+++ b/Include/internal/pycore_code.h
@@ -274,6 +274,8 @@ extern void _PyLineTable_InitAddressRange(
 /** API for traversing the line number table. */
 extern int _PyLineTable_NextAddressRange(PyCodeAddressRange *range);
 extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range);
+// This is used in dump_frame() in traceback.c without an attached tstate.
+extern int _PyCode_Addr2LineNoTstate(PyCodeObject *co, int addr);
 
 /** API for executors */
 extern void _PyCode_Clear_Executors(PyCodeObject *code);
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
index 42e021679b583f..1dbbb053e3fc48 100644
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -1014,7 +1014,7 @@ PyCode_NewEmpty(const char *filename, const char 
*funcname, int firstlineno)
  ******************/
 
 int
-PyCode_Addr2Line(PyCodeObject *co, int addrq)
+_PyCode_Addr2LineNoTstate(PyCodeObject *co, int addrq)
 {
     if (addrq < 0) {
         return co->co_firstlineno;
@@ -1028,6 +1028,16 @@ PyCode_Addr2Line(PyCodeObject *co, int addrq)
     return _PyCode_CheckLineNumber(addrq, &bounds);
 }
 
+int
+PyCode_Addr2Line(PyCodeObject *co, int addrq)
+{
+    int lineno;
+    Py_BEGIN_CRITICAL_SECTION(co);
+    lineno = _PyCode_Addr2LineNoTstate(co, addrq);
+    Py_END_CRITICAL_SECTION();
+    return lineno;
+}
+
 void
 _PyLineTable_InitAddressRange(const char *linetable, Py_ssize_t length, int 
firstlineno, PyCodeAddressRange *range)
 {
diff --git a/Python/traceback.c b/Python/traceback.c
index c06cb1a59089e2..f3c5644aeb1799 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -994,8 +994,8 @@ dump_frame(int fd, _PyInterpreterFrame *frame)
     } else {
         PUTS(fd, "???");
     }
-
-    int lineno = PyUnstable_InterpreterFrame_GetLine(frame);
+    int lasti = PyUnstable_InterpreterFrame_GetLasti(frame);
+    int lineno = _PyCode_Addr2LineNoTstate(code, lasti);
     PUTS(fd, ", line ");
     if (lineno >= 0) {
         _Py_DumpDecimal(fd, (size_t)lineno);

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to