Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-ormsgpack for openSUSE:Factory checked in at 2026-11-09 16:07:31 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-ormsgpack (Old) and /work/SRC/openSUSE:Factory/.python-ormsgpack.new.3759290 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-ormsgpack" Mon Nov 9 16:07:31 2026 rev:3 rq:1396279 version:1.13.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-ormsgpack/python-ormsgpack.changes 2026-10-16 20:13:11.160988352 +0200 +++ /work/SRC/openSUSE:Factory/.python-ormsgpack.new.3759290/python-ormsgpack.changes 2026-11-09 16:08:25.756330042 +0100 @@ -1,0 +2,7 @@ +Mon Nov 9 08:53:21 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to 1.13.1: + * Security: prevent excessive memory and CPU consumption when + decoding truncated MessagePack arrays + +------------------------------------------------------------------- Old: ---- ormsgpack-1.13.0.tar.gz New: ---- ormsgpack-1.13.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-ormsgpack.spec ++++++ --- /var/tmp/diff_new_pack.jyeLbI/_old 2026-11-09 16:08:26.894377713 +0100 +++ /var/tmp/diff_new_pack.jyeLbI/_new 2026-11-09 16:08:26.896377797 +0100 @@ -19,7 +19,7 @@ %global rustflags '-Clink-arg=-Wl,-z,relro,-z,now' %{?sle15_python_module_pythons} Name: python-ormsgpack -Version: 1.13.0 +Version: 1.13.1 Release: 0 Summary: Fast Python msgpack library supporting dataclasses, datetimes, and numpy License: Apache-2.0 OR MIT @@ -58,7 +58,7 @@ %check %python_expand PYTHONPATH=%{buildroot}%{$python_sitearch} python%{$python_bin_suffix} -B -c "import ormsgpack; print(ormsgpack.__version__)" -%files %{python_files} +%files %python_files %doc README.md %license LICENSE-APACHE LICENSE-MIT %{python_sitearch}/ormsgpack ++++++ _service ++++++ --- /var/tmp/diff_new_pack.jyeLbI/_old 2026-11-09 16:08:26.932379305 +0100 +++ /var/tmp/diff_new_pack.jyeLbI/_new 2026-11-09 16:08:26.936379473 +0100 @@ -5,7 +5,7 @@ <param name="update">true</param> </service> <service name="cargo_audit" mode="manual"> - <param name="srcdir">ormsgpack-1.13.0</param> + <param name="srcdir">ormsgpack-1.13.1</param> </service> </services> ++++++ ormsgpack-1.13.0.tar.gz -> ormsgpack-1.13.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/Cargo.lock new/ormsgpack-1.13.1/Cargo.lock --- old/ormsgpack-1.13.0/Cargo.lock 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/Cargo.lock 2006-07-24 03:21:28.000000000 +0200 @@ -87,7 +87,7 @@ [[package]] name = "ormsgpack" -version = "1.13.0" +version = "1.13.1" dependencies = [ "ahash", "chrono", @@ -229,9 +229,9 @@ [[package]] name = "smallvec" -version = "1.16.2" +version = "1.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" +checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" [[package]] name = "syn" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/Cargo.toml new/ormsgpack-1.13.1/Cargo.toml --- old/ormsgpack-1.13.0/Cargo.toml 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/Cargo.toml 2006-07-24 03:21:28.000000000 +0200 @@ -1,6 +1,6 @@ [package] name = "ormsgpack" -version = "1.13.0" +version = "1.13.1" edition = "2021" rust-version = "1.88" include = [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/PKG-INFO new/ormsgpack-1.13.1/PKG-INFO --- old/ormsgpack-1.13.0/PKG-INFO 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/PKG-INFO 2006-07-24 03:21:28.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: ormsgpack -Version: 1.13.0 +Version: 1.13.1 Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Apache Software License @@ -62,7 +62,7 @@ ``` Installing from a source distribution requires -[Rust](https://www.rust-lang.org/) 1.81 or newer and +[Rust](https://www.rust-lang.org/) 1.88 or newer and [maturin](https://github.com/PyO3/maturin). ## Quickstart diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/README.md new/ormsgpack-1.13.1/README.md --- old/ormsgpack-1.13.0/README.md 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/README.md 2006-07-24 03:21:28.000000000 +0200 @@ -30,7 +30,7 @@ ``` Installing from a source distribution requires -[Rust](https://www.rust-lang.org/) 1.81 or newer and +[Rust](https://www.rust-lang.org/) 1.88 or newer and [maturin](https://github.com/PyO3/maturin). ## Quickstart diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/build.rs new/ormsgpack-1.13.1/build.rs --- old/ormsgpack-1.13.0/build.rs 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/build.rs 2006-07-24 03:21:28.000000000 +0200 @@ -3,6 +3,7 @@ pyo3_build_config::add_extension_module_link_args(); let python_config = pyo3_build_config::get(); + println!("cargo::rustc-check-cfg=cfg(check_leaks)"); println!("cargo::rustc-check-cfg=cfg(unicode_state)"); if std::env::var("CARGO_CFG_TARGET_ENDIAN").unwrap() == "little" && !(std::env::var("CARGO_CFG_TARGET_OS").unwrap() == "windows" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/pyproject.toml new/ormsgpack-1.13.1/pyproject.toml --- old/ormsgpack-1.13.0/pyproject.toml 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/pyproject.toml 2006-07-24 03:21:28.000000000 +0200 @@ -1,6 +1,6 @@ [project] name = "ormsgpack" -version = "1.13.0" +version = "1.13.1" requires-python = ">=3.11" classifiers = [ "Development Status :: 5 - Production/Stable", @@ -35,16 +35,17 @@ [project.urls] Homepage = "https://github.com/ormsgpack/ormsgpack" +[project.entry-points.pyinstaller40] +hook-dirs = "ormsgpack._pyinstaller:get_hook_dirs" + [dependency-groups] dev = [ "msgpack", - "mypy; platform_python_implementation == 'CPython'", "pendulum", "pydantic", "pytest", "python-dateutil", "pytz", - "ruff", "types-python-dateutil", "types-pytz", "tzdata", @@ -55,11 +56,21 @@ "pytest-codspeed; platform_python_implementation != 'GraalVM'", ] +lint = [ + "mypy", + "ruff", + "tombi", +] + docs = [ "furo", "sphinx", ] +memray = [ + "pytest-memray", +] + [build-system] build-backend = "maturin" requires = ["maturin>=1.0,<2.0"] @@ -107,6 +118,4 @@ { file = "pyproject.toml" }, ] default-groups = ["dev", "dev-extra"] - -[project.entry-points.pyinstaller40] -hook-dirs = "ormsgpack._pyinstaller:get_hook_dirs" +exclude-newer = "3 days" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/src/deserialize/cache.rs new/ormsgpack-1.13.1/src/deserialize/cache.rs --- old/ormsgpack-1.13.0/src/deserialize/cache.rs 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/src/deserialize/cache.rs 2006-07-24 03:21:28.000000000 +0200 @@ -65,4 +65,16 @@ }; Ok(entry.bind_borrowed(py).to_owned()) } + + #[cfg(check_leaks)] + pub fn contains(&self, obj: &Bound<'_, PyAny>) -> bool { + #[cfg(Py_GIL_DISABLED)] + let entries = self.entries.lock().unwrap(); + #[cfg(not(Py_GIL_DISABLED))] + let entries = self.entries.borrow(); + entries + .iter() + .flatten() + .any(|key| key.as_ptr() == obj.as_ptr()) + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/src/deserialize/deserializer.rs new/ormsgpack-1.13.1/src/deserialize/deserializer.rs --- old/ormsgpack-1.13.0/src/deserialize/deserializer.rs 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/src/deserialize/deserializer.rs 2006-07-24 03:21:28.000000000 +0200 @@ -27,6 +27,7 @@ } } +const PREALLOC_LIMIT: u32 = 64; const RECURSION_LIMIT: u16 = 1024; fn deserialize_slice<'a, 'py>( @@ -227,9 +228,15 @@ fn deserialize_array(&mut self, len: u32) -> Result<Bound<'py, PyList>, Error> { let py = self.py; let state = self.state; - let elements = - (0..len).map(|_| PyItem(self.deserialize().map_err(|e| e.into_pyerr(py, state)))); - PyList::new(py, elements).map_err(Error::PyErr) + let prealloc_len = len.min(PREALLOC_LIMIT); + let elements = (0..prealloc_len) + .map(|_| PyItem(self.deserialize().map_err(|e| e.into_pyerr(py, state)))); + let list = PyList::new(py, elements).map_err(Error::PyErr)?; + for _ in prealloc_len..len { + let item = self.deserialize()?; + list.append(item).map_err(Error::PyErr)?; + } + Ok(list) } fn deserialize_map_with_str_keys(&mut self, len: u32) -> Result<Bound<'py, PyDict>, Error> { @@ -408,6 +415,13 @@ } fn deserialize_map_array_key(&mut self, len: u32) -> Result<Bound<'py, PyTuple>, Error> { + if unlikely(len > PREALLOC_LIMIT) { + let mut elements = Vec::with_capacity(PREALLOC_LIMIT as usize); + for _ in 0..len { + elements.push(self.deserialize_map_key()?); + } + return PyTuple::new(self.py, elements).map_err(Error::PyErr); + } let py = self.py; let state = self.state; let elements = (0..len).map(|_| { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/src/ext.rs new/ormsgpack-1.13.1/src/ext.rs --- old/ormsgpack-1.13.0/src/ext.rs 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/src/ext.rs 2006-07-24 03:21:28.000000000 +0200 @@ -1,77 +1,39 @@ +// SPDX-License-Identifier: (Apache-2.0 OR MIT) + use pyo3::exceptions::PyTypeError; -use pyo3::ffi::*; +use pyo3::gc::{PyTraverseError, PyVisit}; use pyo3::prelude::*; -use pyo3::types::{PyBytes, PyDict, PyInt, PyTuple}; -use std::os::raw::{c_int, c_uint, c_void}; -use std::ptr::null_mut; +use pyo3::types::{PyBytes, PyInt}; -#[repr(C)] +#[pyclass(name = "Ext", module = "ormsgpack", frozen)] pub struct PyExt { - pub ob_base: PyObject, - pub tag: *mut PyObject, - pub data: *mut PyObject, + pub tag: Py<PyInt>, + pub data: Py<PyBytes>, } -#[no_mangle] -unsafe extern "C" fn ext_new( - subtype: *mut PyTypeObject, - args: *mut PyObject, - kwds: *mut PyObject, -) -> *mut PyObject { - let py = Python::assume_attached(); - let args = Borrowed::from_ptr(py, args).cast_unchecked::<PyTuple>(); - let kwds = Borrowed::from_ptr_or_opt(py, kwds).map(|v| v.cast_unchecked::<PyDict>()); - if args.len() != 2 || kwds.is_some_and(|v| v.len() != 0) { - PyTypeError::new_err("Ext.__new__() takes 2 positional arguments").restore(py); - return null_mut(); - } - let tag = args.get_item(0).unwrap(); - if !tag.is_instance_of::<PyInt>() { - PyTypeError::new_err("Ext.__new__() first argument must be int").restore(py); - return null_mut(); +#[pymethods] +impl PyExt { + #[new] + #[pyo3(signature = (tag, data, /))] + fn new(tag: &Bound<'_, PyAny>, data: &Bound<'_, PyAny>) -> PyResult<Self> { + if !tag.is_instance_of::<PyInt>() { + let err = PyTypeError::new_err("Ext.__new__() first argument must be int"); + return Err(err); + } + let tag = unsafe { tag.cast_unchecked::<PyInt>() }; + if !data.is_instance_of::<PyBytes>() { + let err = PyTypeError::new_err("Ext.__new__() second argument must be bytes"); + return Err(err); + } + let data = unsafe { data.cast_unchecked::<PyBytes>() }; + Ok(Self { + tag: tag.clone().unbind(), + data: data.clone().unbind(), + }) } - let data = args.get_item(1).unwrap(); - if !data.is_instance_of::<PyBytes>() { - PyTypeError::new_err("Ext.__new__() second argument must be bytes").restore(py); - return null_mut(); - } - let op = (*subtype).tp_alloc.unwrap()(subtype, 0); - let obj = &mut *op.cast::<PyExt>(); - obj.tag = tag.into_ptr(); - obj.data = data.into_ptr(); - op -} -#[no_mangle] -unsafe extern "C" fn ext_dealloc(op: *mut PyObject) { - let ob_type = Py_TYPE(op); - Py_DECREF((*op.cast::<PyExt>()).tag); - Py_DECREF((*op.cast::<PyExt>()).data); - (*ob_type).tp_free.unwrap()(op.cast::<c_void>()); - Py_DECREF(ob_type.cast::<PyObject>()); -} - -pub fn create_ext_type<'py>(py: Python<'py>) -> PyResult<Bound<'py, PyAny>> { - let mut slots: [PyType_Slot; 3] = [ - PyType_Slot { - slot: Py_tp_new, - pfunc: ext_new as *mut c_void, - }, - PyType_Slot { - slot: Py_tp_dealloc, - pfunc: ext_dealloc as *mut c_void, - }, - PyType_Slot { - slot: 0, - pfunc: null_mut(), - }, - ]; - let mut spec = PyType_Spec { - name: c"ormsgpack.Ext".as_ptr(), - basicsize: std::mem::size_of::<PyExt>() as c_int, - itemsize: 0, - flags: Py_TPFLAGS_DEFAULT as c_uint, - slots: slots.as_mut_ptr(), - }; - unsafe { Bound::from_owned_ptr_or_err(py, PyType_FromSpec(&mut spec)) } + fn __traverse__(&self, visit: PyVisit<'_>) -> Result<(), PyTraverseError> { + visit.call(&self.tag)?; + visit.call(&self.data) + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/src/fragment.rs new/ormsgpack-1.13.1/src/fragment.rs --- old/ormsgpack-1.13.0/src/fragment.rs 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/src/fragment.rs 2006-07-24 03:21:28.000000000 +0200 @@ -1,79 +1,37 @@ +// SPDX-License-Identifier: (Apache-2.0 OR MIT) + use crate::msgpack; use pyo3::exceptions::{PyTypeError, PyValueError}; -use pyo3::ffi::*; +use pyo3::gc::{PyTraverseError, PyVisit}; use pyo3::prelude::*; -use pyo3::types::{PyBytes, PyDict, PyTuple}; -use std::os::raw::{c_int, c_uint, c_void}; -use std::ptr::null_mut; +use pyo3::types::PyBytes; -#[repr(C)] +#[pyclass(name = "Fragment", module = "ormsgpack", frozen)] pub struct PyFragment { - pub ob_base: PyObject, - pub data: *mut PyObject, + pub data: Py<PyBytes>, } -#[no_mangle] -unsafe extern "C" fn fragment_new( - subtype: *mut PyTypeObject, - args: *mut PyObject, - kwds: *mut PyObject, -) -> *mut PyObject { - let py = Python::assume_attached(); - let args = Borrowed::from_ptr(py, args).cast_unchecked::<PyTuple>(); - let kwds = Borrowed::from_ptr_or_opt(py, kwds).map(|v| v.cast_unchecked::<PyDict>()); - if args.len() != 1 || kwds.is_some_and(|v| v.len() != 0) { - PyTypeError::new_err("Fragment.__new__() takes 1 positional argument").restore(py); - return null_mut(); - } - let data = args.get_item(0).unwrap(); - if !data.is_instance_of::<PyBytes>() { - PyTypeError::new_err("Fragment.__new__() first argument must be bytes").restore(py); - return null_mut(); - } - let contents = data.cast_unchecked::<PyBytes>().as_bytes(); - let mut validator = msgpack::Validator::new(contents); - match validator.validate() { - Ok(()) => (), - Err(err) => { - PyValueError::new_err(err.to_string()).restore(py); - return null_mut(); +#[pymethods] +impl PyFragment { + #[new] + #[pyo3(signature = (data, /))] + fn new(data: &Bound<'_, PyAny>) -> PyResult<Self> { + if !data.is_instance_of::<PyBytes>() { + let err = PyTypeError::new_err("Fragment.__new__() first argument must be bytes"); + return Err(err); } + let data = unsafe { data.cast_unchecked::<PyBytes>() }; + let contents = data.as_bytes(); + let mut validator = msgpack::Validator::new(contents); + validator + .validate() + .map_err(|err| PyValueError::new_err(err.to_string()))?; + Ok(Self { + data: data.clone().unbind(), + }) } - let op = (*subtype).tp_alloc.unwrap()(subtype, 0); - let obj = &mut *op.cast::<PyFragment>(); - obj.data = data.into_ptr(); - op -} -#[no_mangle] -unsafe extern "C" fn fragment_dealloc(op: *mut PyObject) { - let ob_type = Py_TYPE(op); - Py_DECREF((*op.cast::<PyFragment>()).data); - (*ob_type).tp_free.unwrap()(op.cast::<c_void>()); - Py_DECREF(ob_type.cast::<PyObject>()); -} - -pub fn create_fragment_type<'py>(py: Python<'py>) -> PyResult<Bound<'py, PyAny>> { - let mut slots: [PyType_Slot; 3] = [ - PyType_Slot { - slot: Py_tp_new, - pfunc: fragment_new as *mut c_void, - }, - PyType_Slot { - slot: Py_tp_dealloc, - pfunc: fragment_dealloc as *mut c_void, - }, - PyType_Slot { - slot: 0, - pfunc: null_mut(), - }, - ]; - let mut spec = PyType_Spec { - name: c"ormsgpack.Fragment".as_ptr(), - basicsize: std::mem::size_of::<PyFragment>() as c_int, - itemsize: 0, - flags: Py_TPFLAGS_DEFAULT as c_uint, - slots: slots.as_mut_ptr(), - }; - unsafe { Bound::from_owned_ptr_or_err(py, PyType_FromSpec(&mut spec)) } + fn __traverse__(&self, visit: PyVisit<'_>) -> Result<(), PyTraverseError> { + visit.call(&self.data) + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/src/lib.rs new/ormsgpack-1.13.1/src/lib.rs --- old/ormsgpack-1.13.0/src/lib.rs 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/src/lib.rs 2006-07-24 03:21:28.000000000 +0200 @@ -35,6 +35,8 @@ module.add_function(wrap_pyfunction!(packb, module)?)?; module.add_function(wrap_pyfunction!(unpackb, module)?)?; + #[cfg(check_leaks)] + module.add_function(wrap_pyfunction!(is_cached_key, module)?)?; module.add("__version__", env!("CARGO_PKG_VERSION"))?; module.add("Ext", state.serialize.ext.type_object.bind(py))?; module.add("Fragment", state.serialize.fragment.type_object.bind(py))?; @@ -122,3 +124,14 @@ opts, ) } + +#[cfg(check_leaks)] +#[pyfunction] +fn is_cached_key(obj: &Bound<'_, PyAny>) -> bool { + STATE + .get(obj.py()) + .unwrap() + .deserialize + .key_map + .contains(obj) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/src/serialize/ext.rs new/ormsgpack-1.13.1/src/serialize/ext.rs --- old/ormsgpack-1.13.0/src/serialize/ext.rs 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/src/serialize/ext.rs 2006-07-24 03:21:28.000000000 +0200 @@ -3,26 +3,26 @@ use crate::ext::PyExt; use crate::ffi::BorrowedWithType; use pyo3::prelude::*; -use pyo3::types::{PyBytes, PyInt}; +use pyo3::types::PyType; use serde::ser::{Serialize, Serializer}; use serde_bytes::Bytes; pub struct State { - pub type_object: Py<PyAny>, + pub type_object: Py<PyType>, } impl State { #[cold] pub fn new(py: Python<'_>) -> PyResult<Self> { Ok(Self { - type_object: crate::ext::create_ext_type(py)?.unbind(), + type_object: py.get_type::<PyExt>().unbind(), }) } } #[repr(transparent)] pub struct Ext<'a, 'py> { - obj: Borrowed<'a, 'py, PyAny>, + obj: Borrowed<'a, 'py, PyExt>, } impl<'a, 'py> Ext<'a, 'py> { @@ -30,7 +30,7 @@ pub fn try_new(obj: BorrowedWithType<'a, 'py>, state: &State) -> Option<Self> { if obj.get_type_ptr() == state.type_object.as_ptr().cast() { Some(Self { - obj: obj.as_borrowed(), + obj: unsafe { obj.as_borrowed().cast_unchecked::<PyExt>() }, }) } else { None @@ -43,17 +43,13 @@ where S: Serializer, { - let ext = self.obj.as_ptr().cast::<PyExt>(); - let tag = match unsafe { - Borrowed::from_ptr(self.obj.py(), (*ext).tag).cast_unchecked::<PyInt>() - } - .extract::<u32>() - { + let py = self.obj.py(); + let ext = self.obj.get(); + let tag = match ext.tag.bind(py).extract::<u32>() { Ok(tag @ 0..=127) => tag, _ => return Err(serde::ser::Error::custom("Extension type out of range")), }; - let data = - unsafe { Borrowed::from_ptr(self.obj.py(), (*ext).data).cast_unchecked::<PyBytes>() }; + let data = ext.data.bind(py); serializer.serialize_newtype_variant("", tag, "", Bytes::new(data.as_bytes())) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ormsgpack-1.13.0/src/serialize/fragment.rs new/ormsgpack-1.13.1/src/serialize/fragment.rs --- old/ormsgpack-1.13.0/src/serialize/fragment.rs 2006-07-24 03:21:28.000000000 +0200 +++ new/ormsgpack-1.13.1/src/serialize/fragment.rs 2006-07-24 03:21:28.000000000 +0200 @@ -3,26 +3,26 @@ use crate::ffi::BorrowedWithType; use crate::fragment::PyFragment; use pyo3::prelude::*; -use pyo3::types::PyBytes; +use pyo3::types::PyType; use serde::ser::{Serialize, Serializer}; use serde_bytes::Bytes; pub struct State { - pub type_object: Py<PyAny>, + pub type_object: Py<PyType>, } impl State { #[cold] pub fn new(py: Python<'_>) -> PyResult<Self> { Ok(Self { - type_object: crate::fragment::create_fragment_type(py)?.unbind(), + type_object: py.get_type::<PyFragment>().unbind(), }) } } #[repr(transparent)] pub struct Fragment<'a, 'py> { - obj: Borrowed<'a, 'py, PyAny>, + obj: Borrowed<'a, 'py, PyFragment>, } impl<'a, 'py> Fragment<'a, 'py> { @@ -30,7 +30,7 @@ pub fn try_new(obj: BorrowedWithType<'a, 'py>, state: &State) -> Option<Self> { if obj.get_type_ptr() == state.type_object.as_ptr().cast() { Some(Self { - obj: obj.as_borrowed(), + obj: unsafe { obj.as_borrowed().cast_unchecked::<PyFragment>() }, }) } else { None @@ -43,10 +43,9 @@ where S: Serializer, { - let fragment = self.obj.as_ptr().cast::<PyFragment>(); - let data = unsafe { - Borrowed::from_ptr(self.obj.py(), (*fragment).data).cast_unchecked::<PyBytes>() - }; + let py = self.obj.py(); + let fragment = self.obj.get(); + let data = fragment.data.bind(py); serializer.serialize_newtype_struct("", Bytes::new(data.as_bytes())) } ++++++ vendor.tar.zst ++++++ ++++ 430036 lines of diff (skipped)
