Rare crash when running is_valid() on Serializer

120 views
Skip to first unread message

David Erie

unread,
Apr 24, 2025, 4:48:55 PMApr 24
to Django REST framework
Hi, I have a SEGFAULT crash occurring on the order of months and I finally got a Python backtrace out of gdb to help track down the root cause. We have DRF 3.14.0 running on Python 3.11.7 on Red Hat. Can anyone see a problem with this stack trace?

(gdb) py-bt
Traceback (most recent call first):
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/fields.py", line 356, in __init__
    self.error_messages = messages
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/fields.py", line 1553, in __init__
    super().__init__(**kwargs)
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/fields.py", line 655, in __deepcopy__
    return self.__class__(*args, **kwargs)
  File "/usr/lib64/python3.11/copy.py", line 153, in deepcopy
    y = copier(memo)
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/fields.py", line 1575, in __init__
    self.child = kwargs.pop('child', copy.deepcopy(self.child))
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/fields.py", line 655, in __deepcopy__
    return self.__class__(*args, **kwargs)
  File "/usr/lib64/python3.11/copy.py", line 153, in deepcopy
    y = copier(memo)
  File "/usr/lib64/python3.11/copy.py", line 297, in _reconstruct
    value = deepcopy(value, memo)
  File "/usr/lib64/python3.11/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/serializers.py", line 379, in get_fields
    return copy.deepcopy(self._declared_fields)
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/serializers.py", line 356, in fields
    for key, value in self.get_fields().items():
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/django/utils/functional.py", line 57, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/serializers.py", line 362, in _writable_fields
    for field in self.fields.values():
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/serializers.py", line 479, in to_internal_value
    for field in fields:
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/serializers.py", line 426, in run_validation
    value = self.to_internal_value(data)
  File "/usr/local/lib/viacontrol/4.0.0/device-manager/lib/python3.11/site-packages/rest_framework/serializers.py", line 227, in is_valid
    self._validated_data = self.run_validation(self.initial_data)


Thank you for the help.

David Erie

unread,
Apr 24, 2025, 5:07:15 PMApr 24
to Django REST framework
More info I found in the backtrace. I am afraid this points to memory corruption:

error_messages={
'required': <__proxy__(_proxy____args=('This field is required.',), _proxy____kw={}) at remote 0x7f40bdf738d0>,
'null': <__proxy__(_proxy____args=('This field may not be null.',), _proxy____kw={}) at remote 0x7f40bdf73950>,
'invalid': <__proxy__(_proxy____args=('Invalid data. Expected a dictionary, but got {datatype}.',), _proxy____kw={}) at remote 0x7f40bdf8c450>
}

Reply all
Reply to author
Forward
0 new messages