Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mock.seal has infinite recursion with int class attributes #89319

Closed
dseomn mannequin opened this issue Sep 9, 2021 · 8 comments
Closed

mock.seal has infinite recursion with int class attributes #89319

dseomn mannequin opened this issue Sep 9, 2021 · 8 comments
Labels
3.9 only security fixes 3.10 only security fixes 3.11 only security fixes stdlib Python modules in the Lib dir type-crash A hard crash of the interpreter, possibly with a core dump

Comments

@dseomn
Copy link
Mannequin

dseomn mannequin commented Sep 9, 2021

BPO 45156
Nosy @vstinner, @miss-islington, @tirkarthi, @sobolevn, @iritkatriel, @dseomn
PRs
  • bpo-45156: fixes inifite loop on mock.seal() #28300
  • [3.10] bpo-45156: Fixes inifite loop on unittest.mock.seal() (GH-28300) #28326
  • [3.9] bpo-45156: Fixes inifite loop on unittest.mock.seal() (GH-28300) #28327
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2021-09-16.13:22:23.550>
    created_at = <Date 2021-09-09.22:09:24.120>
    labels = ['3.10', 'library', '3.9', 'type-crash', '3.11']
    title = 'mock.seal has infinite recursion with int class attributes'
    updated_at = <Date 2021-09-16.13:22:23.549>
    user = 'https://github.com/dseomn'

    bugs.python.org fields:

    activity = <Date 2021-09-16.13:22:23.549>
    actor = 'vstinner'
    assignee = 'none'
    closed = True
    closed_date = <Date 2021-09-16.13:22:23.550>
    closer = 'vstinner'
    components = ['Library (Lib)']
    creation = <Date 2021-09-09.22:09:24.120>
    creator = 'dseomn'
    dependencies = []
    files = []
    hgrepos = []
    issue_num = 45156
    keywords = ['patch']
    message_count = 8.0
    messages = ['401525', '401669', '401670', '401694', '401765', '401773', '401774', '401945']
    nosy_count = 6.0
    nosy_names = ['vstinner', 'miss-islington', 'xtreak', 'sobolevn', 'iritkatriel', 'dseomn']
    pr_nums = ['28300', '28326', '28327']
    priority = 'normal'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'crash'
    url = 'https://bugs.python.org/issue45156'
    versions = ['Python 3.9', 'Python 3.10', 'Python 3.11']

    @dseomn
    Copy link
    Mannequin Author

    dseomn mannequin commented Sep 9, 2021

    The code below seems to have infinite recursion in the mock.seal call with python 3.9.2.

    from unittest import mock
    class Foo:
      foo = 0
    foo = mock.create_autospec(Foo)
    mock.seal(foo)

    @dseomn dseomn mannequin added 3.9 only security fixes stdlib Python modules in the Lib dir type-crash A hard crash of the interpreter, possibly with a core dump labels Sep 9, 2021
    @iritkatriel
    Copy link
    Member

    Reproduced on 3.11:

    >> foo = mock.create_autospec(Foo)
    >> mock.seal(foo)

    ^CTraceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/iritkatriel/src/cpython-1/Lib/unittest/mock.py", line 2917, in seal
        seal(m)
        ^^^^^^^
      File "/Users/iritkatriel/src/cpython-1/Lib/unittest/mock.py", line 2917, in seal
        seal(m)
        ^^^^^^^
      File "/Users/iritkatriel/src/cpython-1/Lib/unittest/mock.py", line 2917, in seal
        seal(m)
        ^^^^^^^
      [Previous line repeated 645 more times]
      File "/Users/iritkatriel/src/cpython-1/Lib/unittest/mock.py", line 2911, in seal
        m = getattr(mock, attr)
            ^^^^^^^^^^^^^^^^^^^
      File "/Users/iritkatriel/src/cpython-1/Lib/unittest/mock.py", line 662, in __getattr__
        result = create_autospec(
                 ^^^^^^^^^^^^^^^^
      File "/Users/iritkatriel/src/cpython-1/Lib/unittest/mock.py", line 2672, in create_autospec
        mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/Users/iritkatriel/src/cpython-1/Lib/unittest/mock.py", line 416, in __new__
        new = type(cls.__name__, bases, {'__doc__': cls.__doc__})
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    KeyboardInterrupt

    @iritkatriel iritkatriel added 3.10 only security fixes 3.11 only security fixes labels Sep 12, 2021
    @iritkatriel
    Copy link
    Member

    Pdb) list
    2916 if m._mock_new_parent is mock:
    2917 try:
    2918 seal(m)
    2919 except:
    2920 breakpoint()
    2921 -> raise
    2922
    2923
    2924 class _AsyncIterator:
    2925 """
    2926 Wraps an iterator in an asynchronous iterator.
    (Pdb) p m
    <MagicMock name='mock.foo.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.denominator.as_integer_ratio' spec='builtin_function_or_method' id='4405352848'>

    @sobolevn
    Copy link
    Member

    I've proposed a solution, based on the assumption that we don't need to recurse into _SpecState props:

    if isinstance(m._mock_children.get(attr), _SpecState):
       continue
    

    It seems like a simple and reasonable thing to do.
    Link: #28300

    @vstinner
    Copy link
    Member

    New changeset 7f60c9e by Nikita Sobolev in branch 'main':
    bpo-45156: Fixes inifite loop on unittest.mock.seal() (GH-28300)
    7f60c9e

    @miss-islington
    Copy link
    Contributor

    New changeset 13257d9 by Miss Islington (bot) in branch '3.9':
    bpo-45156: Fixes inifite loop on unittest.mock.seal() (GH-28300)
    13257d9

    @vstinner
    Copy link
    Member

    New changeset fd74d26 by Miss Islington (bot) in branch '3.10':
    bpo-45156: Fixes inifite loop on unittest.mock.seal() (GH-28300) (GH-28326)
    fd74d26

    @vstinner
    Copy link
    Member

    Thanks for the report and the fix!

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    3.9 only security fixes 3.10 only security fixes 3.11 only security fixes stdlib Python modules in the Lib dir type-crash A hard crash of the interpreter, possibly with a core dump
    Projects
    None yet
    Development

    No branches or pull requests

    4 participants