gh-138661: fix data race in PyCode_Addr2Line (#138664)

This commit is contained in:
Kumar Aditya 2025-09-12 18:04:55 +05:30 committed by GitHub
parent c3fca5d478
commit ea26f6da39
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 15 additions and 3 deletions

View file

@ -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);

View file

@ -1006,7 +1006,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;
@ -1020,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)
{

View file

@ -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);