Skip to content

Commit fb5bdbe

Browse files
committed
Fix memory leak in deserializing dict
1 parent 46fa31c commit fb5bdbe

1 file changed

Lines changed: 12 additions & 8 deletions

File tree

src/decode.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,20 @@ impl<'de, 'a> Visitor<'de> for JsonValue {
161161
{
162162
let dict_ptr = unsafe { pyo3::ffi::PyDict_New() };
163163
while let Some((key, value)) = map.next_entry_seed(PhantomData::<Cow<str>>, self)? {
164-
let _ = unsafe {
165-
pyo3::ffi::PyDict_SetItem(
166-
dict_ptr,
167-
pyo3::ffi::PyUnicode_FromStringAndSize(
168-
key.as_ptr() as *const c_char,
169-
key.len() as pyo3::ffi::Py_ssize_t,
170-
),
171-
value,
164+
let pykey = unsafe {
165+
pyo3::ffi::PyUnicode_FromStringAndSize(
166+
key.as_ptr() as *const c_char,
167+
key.len() as pyo3::ffi::Py_ssize_t,
172168
)
173169
};
170+
let _ = unsafe { pyo3::ffi::PyDict_SetItem(dict_ptr, pykey, value) };
171+
// counter Py_INCREF in insertdict
172+
unsafe {
173+
pyo3::ffi::Py_DECREF(pykey);
174+
if std::intrinsics::likely(value != typeref::NONE) {
175+
pyo3::ffi::Py_DECREF(value)
176+
}
177+
};
174178
}
175179
Ok(dict_ptr)
176180
}

0 commit comments

Comments
 (0)