Skip to content

Segmentation fault after deleting __fields__ attribute from ast.AST #126105

Closed

Description

@federicovalenso

Crash report

What happened?

>>> import ast
>>> dir(ast.AST)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__match_args__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_attributes', '_fields']
>>> del ast.AST._fields
>>> dir(ast.AST)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__match_args__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_attributes']
>>> t = ast.AST(arg1=123)
Segmentation fault

This happens because fields variable is null-pointer here, moreover it was previously checked for null here.

CPython versions tested on:

3.11

Operating systems tested on:

Linux

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

Python 3.11.9 (main, Oct 28 2024, 23:26:29) [GCC 13.2.0]

Linked PRs

Activity

  1. added
    interpreter-core(Objects, Python, Grammar, and Parser dirs)
    3.12only security fixes
    3.13only security fixes
    3.14bugs and security fixes
    on Oct 29, 2024
  2. picnixz commented on Oct 29, 2024

    @picnixz
    Member

    cc @Eclips4 @JelleZijlstra (Would adding Py_TPFLAGS_IMMUTABLETYPE work or is it too restrictive?)

  3. sobolevn commented on Oct 29, 2024

    @sobolevn
    Member

    I can confirm, that this still happens on main:

    Python 3.14.0a1+ (heads/main:19e93e2e269, Oct 28 2024, 11:42:01) [Clang 15.0.0 (clang-1500.3.9.4)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import ast
    >>> del ast.AST._fields
    >>> t = ast.AST(arg1=123)
    [1]    85885 segmentation fault  ./python.exe
                              
    

    Py_TPFLAGS_IMMUTABLETYPE

    I think that this is an overkill and it change the semantics here. We can just modify the code and check for NULL explicitly.

    See

    ast_type_init(PyObject *self, PyObject *args, PyObject *kw)

  4. self-assigned this
    on Oct 29, 2024
  5. picnixz commented on Oct 29, 2024

    @picnixz
    Member

    Oh yes, we only need to modify:

        if (PyObject_GetOptionalAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) {
            goto cleanup;
        }
    

    with a NULL check beforehand I think. What do you think?

  6. added 2 commits that reference this issue on Oct 29, 2024
  7. Eclips4 commented on Oct 29, 2024

    @Eclips4
    Member

    cc @Eclips4 @JelleZijlstra (Would adding Py_TPFLAGS_IMMUTABLETYPE work or is it too restrictive?)

    If you are talking about making nodes immutable, we can't do that because a lot of code relies on the fact that nodes are mutable. So it would be a huge breaking change.

  8. added a commit that references this issue on Oct 29, 2024
  9. added a commit that references this issue on Oct 29, 2024
  10. added 3 commits that reference this issue on Oct 29, 2024
  11. Eclips4 commented on Oct 29, 2024

    @Eclips4
    Member

    Thank you Valery for the report and Nikita for the fix.

  12. added a commit that references this issue on Dec 8, 2024
  13. added a commit that references this issue on Jan 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

3.12only security fixes3.13only security fixes3.14bugs and security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)type-crashA hard crash of the interpreter, possibly with a core dump

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions