Skip to content

Segfault calling MultiDict().setdefault() #1159

@devdanzin

Description

@devdanzin

Using latest git version of 3.13, calling MultiDict().setdefault("a") segfaults:

import multidict
m = multidict.MultiDict()
m.setdefault("a")

The backtrace references cpython-3.13.2, so I tested the repro code against that version and still got a segfault.

Backtrace:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6d38402 in Py_INCREF (op=0x0)
    at /opt/_internal/cpython-3.13.2/include/python3.13/object.h:826
warning: 826    /opt/_internal/cpython-3.13.2/include/python3.13/object.h: No such file or directory

#0  0x00007ffff6d38402 in Py_INCREF (op=0x0)
    at /opt/_internal/cpython-3.13.2/include/python3.13/object.h:826
#1  _pair_list_add_with_hash (hash=-8311172392442909167, value=0x0,
    key=0x555555b2e628 <_PyRuntime+94600>, identity=0x555555b2e628 <_PyRuntime+94600>,
    list=0x555555e8b610) at multidict/_multilib/pair_list.h:360
#2  pair_list_set_default (value=<optimized out>, key=<optimized out>, list=0x555555e8b610)
    at multidict/_multilib/pair_list.h:802
#3  multidict_setdefault (self=0x555555e8b600, args=<optimized out>, nargs=<optimized out>,
    kwnames=<optimized out>) at multidict/_multidict.c:576
#4  0x00005555556815b3 in method_vectorcall_FASTCALL_KEYWORDS (func=0x7ffff6da1850,
    args=0x7ffff7fb0640, nargsf=<optimized out>, kwnames=0x0) at Objects/descrobject.c:420
#5  0x00005555556746fa in _PyObject_VectorcallTstate (tstate=0x555555b604c0 <_PyRuntime+299040>,
    callable=callable@entry=0x7ffff6da1850, args=args@entry=0x7ffff7fb0640,
    nargsf=9223372036854775810, kwnames=kwnames@entry=0x0) at ./Include/internal/pycore_call.h:168
#6  0x00005555556747d6 in PyObject_Vectorcall (callable=callable@entry=0x7ffff6da1850,
    args=args@entry=0x7ffff7fb0640, nargsf=<optimized out>, kwnames=kwnames@entry=0x0)
    at Objects/call.c:327
#7  0x00005555557a310b in _PyEval_EvalFrameDefault (tstate=0x555555b604c0 <_PyRuntime+299040>,
    frame=0x7ffff7fb05f0, throwflag=0) at Python/generated_cases.c.h:813
#8  0x00005555557b4b05 in _PyEval_EvalFrame (
    tstate=tstate@entry=0x555555b604c0 <_PyRuntime+299040>, frame=<optimized out>,
    throwflag=throwflag@entry=0) at ./Include/internal/pycore_ceval.h:119
#9  0x00005555557b4c34 in _PyEval_Vector (tstate=tstate@entry=0x555555b604c0 <_PyRuntime+299040>,
    func=func@entry=0x7ffff6f996d0, locals=locals@entry=0x7ffff7463d70, args=args@entry=0x0,
    argcount=argcount@entry=0, kwnames=kwnames@entry=0x0) at Python/ceval.c:1816
#10 0x00005555557b4cf7 in PyEval_EvalCode (co=co@entry=0x7ffff6f25ad0,
    globals=globals@entry=0x7ffff7463d70, locals=locals@entry=0x7ffff7463d70)
    at Python/ceval.c:604
#11 0x00005555557988e1 in builtin_exec_impl (module=module@entry=0x7ffff75a6930,
    source=0x7ffff6f25ad0, globals=0x7ffff7463d70, locals=0x7ffff7463d70, closure=0x0)
    at Python/bltinmodule.c:1143
#12 0x0000555555798a44 in builtin_exec (module=0x7ffff75a6930, args=<optimized out>,
    args@entry=0x7ffff7fb05e0, nargs=nargs@entry=2, kwnames=kwnames@entry=0x0)
    at Python/clinic/bltinmodule.c.h:556
#13 0x00005555557a46de in _PyEval_EvalFrameDefault (tstate=0x555555b604c0 <_PyRuntime+299040>,
    frame=0x7ffff7fb0578, throwflag=0) at Python/generated_cases.c.h:1217
#14 0x00005555557b4b05 in _PyEval_EvalFrame (
    tstate=tstate@entry=0x555555b604c0 <_PyRuntime+299040>, frame=<optimized out>,
    throwflag=throwflag@entry=0) at ./Include/internal/pycore_ceval.h:119
#15 0x00005555557b4c34 in _PyEval_Vector (tstate=tstate@entry=0x555555b604c0 <_PyRuntime+299040>,
    func=func@entry=0x7ffff74d7dd0, locals=locals@entry=0x7ffff7463d70, args=args@entry=0x0,
    argcount=argcount@entry=0, kwnames=kwnames@entry=0x0) at Python/ceval.c:1816
#16 0x00005555557b4cf7 in PyEval_EvalCode (co=co@entry=0x7ffff73da200,
    globals=globals@entry=0x7ffff7463d70, locals=locals@entry=0x7ffff7463d70)
    at Python/ceval.c:604
#17 0x00005555557988e1 in builtin_exec_impl (module=module@entry=0x7ffff75a6930,
    source=0x7ffff73da200, globals=0x7ffff7463d70, locals=0x7ffff7463d70, closure=0x0)
    at Python/bltinmodule.c:1143
#18 0x0000555555798a44 in builtin_exec (module=0x7ffff75a6930, args=<optimized out>,
    args@entry=0x7ffff7fb0180, nargs=nargs@entry=2, kwnames=kwnames@entry=0x0)
    at Python/clinic/bltinmodule.c.h:556
#19 0x00005555556c6249 in cfunction_vectorcall_FASTCALL_KEYWORDS (func=0x7ffff75a6f90,
    args=0x7ffff7fb0180, nargsf=<optimized out>, kwnames=0x0) at Objects/methodobject.c:441
#20 0x00005555556746fa in _PyObject_VectorcallTstate (tstate=0x555555b604c0 <_PyRuntime+299040>,
    callable=callable@entry=0x7ffff75a6f90, args=args@entry=0x7ffff7fb0180,
    nargsf=9223372036854775810, kwnames=kwnames@entry=0x0) at ./Include/internal/pycore_call.h:168
#21 0x00005555556747d6 in PyObject_Vectorcall (callable=callable@entry=0x7ffff75a6f90,
    args=args@entry=0x7ffff7fb0180, nargsf=<optimized out>, kwnames=kwnames@entry=0x0)
    at Objects/call.c:327
#22 0x00005555557a310b in _PyEval_EvalFrameDefault (tstate=0x555555b604c0 <_PyRuntime+299040>,
    frame=0x7ffff7fb00d8, throwflag=0) at Python/generated_cases.c.h:813
#23 0x00005555557b4b05 in _PyEval_EvalFrame (
    tstate=tstate@entry=0x555555b604c0 <_PyRuntime+299040>, frame=<optimized out>,
    throwflag=throwflag@entry=0) at ./Include/internal/pycore_ceval.h:119
#24 0x00005555557b4c34 in _PyEval_Vector (tstate=0x555555b604c0 <_PyRuntime+299040>,
    func=0x7ffff6f99010, locals=locals@entry=0x0, args=0x7ffff6f71968, argcount=2, kwnames=0x0)
    at Python/ceval.c:1816
#25 0x0000555555674391 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>,
    nargsf=<optimized out>, kwnames=<optimized out>) at Objects/call.c:413
#26 0x0000555555676029 in _PyVectorcall_Call (
    tstate=tstate@entry=0x555555b604c0 <_PyRuntime+299040>,
    func=0x555555674339 <_PyFunction_Vectorcall>, callable=callable@entry=0x7ffff6f99010,
    tuple=tuple@entry=0x7ffff6f71950, kwargs=kwargs@entry=0x0) at Objects/call.c:273
#27 0x0000555555676349 in _PyObject_Call (tstate=0x555555b604c0 <_PyRuntime+299040>,
    callable=callable@entry=0x7ffff6f99010, args=args@entry=0x7ffff6f71950,
    kwargs=kwargs@entry=0x0) at Objects/call.c:348
#28 0x0000555555676385 in PyObject_Call (callable=callable@entry=0x7ffff6f99010,
    args=args@entry=0x7ffff6f71950, kwargs=kwargs@entry=0x0) at Objects/call.c:373
#29 0x000055555584aa3f in pymain_run_module (modname=modname@entry=0x55555592e4a8 L"_pyrepl",
    set_argv0=set_argv0@entry=0) at Modules/main.c:349

multidict.__version__

'6.4.3'

Python versions:

Python 3.13.3+ (heads/3.13:fdcaaad1cc7, Apr 27 2025, 10:17:23) [GCC 14.2.0] on linux
Python 3.13.2 (tags/v3.13.2:4f8bb3947cf, May  4 2025, 08:34:35) [GCC 14.2.0]

Found using fusil by @vstinner.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions