From 19b6f6da4161b887ed65e9057bfb4dca92032884 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Mon, 8 Sep 2025 19:40:34 +0530 Subject: [PATCH 1/4] =?UTF-8?q?fix=20data=20race=20in=20=CC=8CPyCode=5FAdd?= =?UTF-8?q?r2Line?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Objects/codeobject.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 55ba6ae372be41..bdb5aae3dd1afe 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1011,9 +1011,16 @@ PyCode_Addr2Line(PyCodeObject *co, int addrq) if (addrq < 0) { return co->co_firstlineno; } + int lineno = -2; // -1 is a valid line number + Py_BEGIN_CRITICAL_SECTION(co); if (co->_co_monitoring && co->_co_monitoring->lines) { - return _Py_Instrumentation_GetLine(co, addrq/sizeof(_Py_CODEUNIT)); + lineno = _Py_Instrumentation_GetLine(co, addrq/sizeof(_Py_CODEUNIT)); + } + Py_END_CRITICAL_SECTION(); + if (lineno != -2) { + return lineno; } + assert(addrq >= 0 && addrq < _PyCode_NBYTES(co)); PyCodeAddressRange bounds; _PyCode_InitAddressRange(co, &bounds); From d8d0f026dbbab218f0477df3937fdc0feb2eb106 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Thu, 11 Sep 2025 18:09:26 +0530 Subject: [PATCH 2/4] fix faulthandler --- Include/internal/pycore_code.h | 2 ++ Objects/codeobject.c | 23 +++++++++++++---------- Python/traceback.c | 4 ++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 8e1415f27b63f3..0f0804d5db61f7 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 bdb5aae3dd1afe..1fc60364be26ef 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1005,20 +1005,13 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) * source location tracking (co_lines/co_positions) ******************/ -int -PyCode_Addr2Line(PyCodeObject *co, int addrq) -{ +int _PyCode_Addr2LineNoTstate(PyCodeObject *co, int addrq){ if (addrq < 0) { return co->co_firstlineno; } - int lineno = -2; // -1 is a valid line number - Py_BEGIN_CRITICAL_SECTION(co); + if (co->_co_monitoring && co->_co_monitoring->lines) { - lineno = _Py_Instrumentation_GetLine(co, addrq/sizeof(_Py_CODEUNIT)); - } - Py_END_CRITICAL_SECTION(); - if (lineno != -2) { - return lineno; + return _Py_Instrumentation_GetLine(co, addrq/sizeof(_Py_CODEUNIT)); } assert(addrq >= 0 && addrq < _PyCode_NBYTES(co)); @@ -1027,6 +1020,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 da7956d1ec47b4..46106e52dbaf82 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -993,8 +993,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); From 814e5df3cdac1970acbd815e4d1d5ec8b3ce4d44 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Thu, 11 Sep 2025 18:10:24 +0530 Subject: [PATCH 3/4] fmt --- Objects/codeobject.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 1fc60364be26ef..171c7810cf1f05 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1005,15 +1005,14 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) * source location tracking (co_lines/co_positions) ******************/ -int _PyCode_Addr2LineNoTstate(PyCodeObject *co, int addrq){ +int +_PyCode_Addr2LineNoTstate(PyCodeObject *co, int addrq){ if (addrq < 0) { return co->co_firstlineno; } - if (co->_co_monitoring && co->_co_monitoring->lines) { return _Py_Instrumentation_GetLine(co, addrq/sizeof(_Py_CODEUNIT)); } - assert(addrq >= 0 && addrq < _PyCode_NBYTES(co)); PyCodeAddressRange bounds; _PyCode_InitAddressRange(co, &bounds); From e964d42251a42f705100a0a59144e975cf36c7a7 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Thu, 11 Sep 2025 18:13:23 +0530 Subject: [PATCH 4/4] fmt --- Objects/codeobject.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 171c7810cf1f05..0d264a6e346f95 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1006,7 +1006,8 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) ******************/ int -_PyCode_Addr2LineNoTstate(PyCodeObject *co, int addrq){ +_PyCode_Addr2LineNoTstate(PyCodeObject *co, int addrq) +{ if (addrq < 0) { return co->co_firstlineno; }