python / python/cpython

Segfault/debug abort because _PyModule_GetFilenameUTF8 asserts module filenames must be utf-8 (called by crossinterp)

未關閉
#156,122 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

extension-modules topic-subinterpreters type-crash
主要語言
Python
星號
77.2k
分支
36k
PR 合併指標
PR 指標待擷取

描述

Crash report

What happened?
import __main__
from concurrent import interpreters

__main__.__file__ = "bad\ud800.py"

interp = interpreters.create()
interp.call(lambda x: x, [1])
sstagg@sapphire ~/s/t/cpython (main)> ./python.exe temp/crossinterp-main.py
Assertion failed: (size >= 0), function _PyModule_GetFilenameUTF8, file moduleobject.c, line 995.
fish: Job 1, './python.exe temp/crossinterp-m…' terminated by signal SIGABRT (Abort)

on a non-debug build:

fish: Job 1, 'python' terminated by signal SIGSEGV (Address boundary error)

because the result is passed to strncpy:

LLDB
Process 31843 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
       frame #0: 0x000000019c4a0e14 libsystem_platform.dylib`_platform_strcpy + 4
libsystem_platform.dylib`_platform_strcpy:
->  0x19c4a0e14 <+4>:  ldr    q0, [x9]
    0x19c4a0e18 <+8>:  str    q0, [sp, #-0x10]!
    0x19c4a0e1c <+12>: ands   x8, x1, #0xf
    0x19c4a0e20 <+16>: b.eq   0x19c4a0e7c    ; <+108>
Target 0: (python) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
   * frame #0: 0x000000019c4a0e14 libsystem_platform.dylib`_platform_strcpy + 4
     frame #1: 0x00000001007e30c0 libpython3.14.dylib`_PyModule_GetFilenameUTF8 + 344
     frame #2: 0x00000001008f0fa4 libpython3.14.dylib`_PyPickle_GetXIData + 484
     frame #3: 0x00000001008f0d1c libpython3.14.dylib`_PyObject_GetXIData + 120
     frame #4: 0x00000001008f55e4 libpython3.14.dylib`_tuple_shared + 200
     frame #5: 0x00000001008f0bb4 libpython3.14.dylib`_get_xidata + 344
     frame #6: 0x00000001008f0ce8 libpython3.14.dylib`_PyObject_GetXIData + 68
     frame #7: 0x00000001000c5354 _interpreters.cpython-314-darwin.so`interp_call + 308
     frame #8: 0x00000001007e1904 libpython3.14.dylib`cfunction_call + 92
     frame #9: 0x0000000100785d08 libpython3.14.dylib`_PyObject_MakeTpCall + 304
     frame #10: 0x00000001008c64e0 libpython3.14.dylib`_PyEval_EvalFrameDefault + 15148
     frame #11: 0x00000001008c24b0 libpython3.14.dylib`PyEval_EvalCode + 416
     frame #12: 0x00000001008bec1c libpython3.14.dylib`builtin_exec + 1392
     frame #13: 0x00000001008c599c libpython3.14.dylib`_PyEval_EvalFrameDefault + 12264
     frame #14: 0x00000001008c26dc libpython3.14.dylib`_PyEval_Vector + 496
     frame #15: 0x00000001007864d8 libpython3.14.dylib`_PyVectorcall_Call + 116
     frame #16: 0x00000001009674bc libpython3.14.dylib`pymain_start_pyrepl + 628
     frame #17: 0x000000010096704c libpython3.14.dylib`pymain_run_stdin + 640
     frame #18: 0x00000001009665c0 libpython3.14.dylib`Py_RunMain + 1584
     frame #19: 0x000000010096682c libpython3.14.dylib`pymain_main + 320
     frame #20: 0x00000001009668d0 libpython3.14.dylib`Py_BytesMain + 44
     frame #21: 0x000000019c0c3e88 dyld`start + 6688
(lldb)

_PyModule_GetFilenameUTF8 only appears to be called by crossinterp module, but it does this:

https://github.com/python/cpython/blob/91d71dd67074d4599b6bd49cc933f41f8bd57058/Objects/moduleobject.c#L994-L995

Which means that if a module filename has a lone surrogate, then it PyUnicode_AsUTF8AndSize retusns and sets size -1, which triggers the abort.

I'm not sure what should happen here, should lone surrogates in module filenames be allowed? or should this 'just work' by not trying to coerce to utf8?

CPython versions tested on:

CPython main branch

Operating systems tested on:

macOS

Output from running 'python -VV' on the command line:

Python 3.16.0a0 (heads/main:e8158d1a02d, Aug 20 2026, 15:09:24) [Clang 21.0.0 (clang-2100.3.27.1)]

Linked PRs
  • gh-156218
  • gh-156221

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

從 Objects/moduleobject.c 中的 _PyModule_GetFilenameUTF8 附近開始,沿著 traceback 中顯示的跨直譯器呼叫路徑進行追蹤,包括 _PyPickle_GetXIData。重現所提供的帶有 lone-surrogate 的 main.file 範例,確立預期的檔案名稱處理方式,並新增回歸測試,證明該呼叫不再 abort 或導致 segfault。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
python
領域
backend
Issue 類型
缺陷
難度
4/5
預估耗時
3-5 天
活躍度
停滯
描述清晰度
基本清楚
新手友好度
25/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。