From ef500242902dc2a7074b76bc201e0ae4aa7a2aa9 Mon Sep 17 00:00:00 2001 From: "Ilya (Marshal)" Date: Tue, 2 Dec 2025 21:04:40 +0100 Subject: [PATCH] Fix error handling in array and map length checks --- Cargo.toml | 2 +- src/lib.rs | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a475343..01e1dbb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libipld" -version = "3.3.0" +version = "3.3.1" edition = "2021" license = "MIT" description = "Python binding to the Rust IPLD library" diff --git a/src/lib.rs b/src/lib.rs index 0434a64..3fbbae2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -201,8 +201,9 @@ where .into() } major::ARRAY => { - let len: ffi::Py_ssize_t = - types::Array::len(r)?.expect("contains length").try_into()?; + let len: ffi::Py_ssize_t = types::Array::len(r)? + .ok_or_else(|| anyhow!("Array must contain length"))? + .try_into()?; unsafe { let ptr = ffi::PyList_New(len); @@ -220,7 +221,7 @@ where } } major::MAP => { - let len = types::Map::len(r)?.expect("contains length"); + let len = types::Map::len(r)?.ok_or_else(|| anyhow!("Map must contain length"))?; let dict = PyDict::new(py); let mut prev_key: Option<&[u8]> = None; @@ -368,7 +369,7 @@ where for (key, i) in keys { key.get(..) - .expect("whole range is a valid string") + .ok_or_else(|| anyhow!("Invalid string range while encoding map key"))? .encode(w)?; let value = unsafe { values.get_item_unchecked(i) }; encode_dag_cbor_from_pyobject(_py, &value, w)?; @@ -542,12 +543,7 @@ pub fn decode_dag_cbor(py: Python, data: &[u8]) -> PyResult> { let py_object = decode_dag_cbor_to_pyobject(py, &mut reader, 0); if let Ok(py_object) = py_object { // check for any remaining data in the reader - if reader - .fill(1) - .expect("SliceReader never fails") - .as_ref() - .is_empty() - { + if reader.fill(1)?.as_ref().is_empty() { Ok(py_object) } else { Err(get_err(