This is an automated email from the ASF dual-hosted git repository. alamb pushed a commit to branch alamb/backport_9813 in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
commit 5ba59e3842d92532a7558c40b04bba6cbbc16806 Merge: cab800615e 1e7097ff91 Author: Andrew Lamb <[email protected]> AuthorDate: Wed May 6 12:52:14 2026 -0400 Merge remote-tracking branch 'apache/56_maintenance' into alamb/backport_9813 arrow-array/src/array/fixed_size_binary_array.rs | 122 +++++++++++++++++--- arrow-buffer/src/buffer/mutable.rs | 95 +++++++++++++++- arrow-buffer/src/builder/mod.rs | 24 ++++ arrow-buffer/src/util/bit_chunk_iterator.rs | 10 +- arrow-data/src/data.rs | 137 ++++++++++++++++++++--- arrow-row/src/lib.rs | 19 +++- 6 files changed, 369 insertions(+), 38 deletions(-) diff --cc arrow-data/src/data.rs index 302ee12f3f,c8202f5641..10770d39cb --- a/arrow-data/src/data.rs +++ b/arrow-data/src/data.rs @@@ -2261,19 -2285,86 +2288,99 @@@ mod tests assert_eq!(data.null_count() - 1, new_data.null_count()); } + #[test] + #[should_panic(expected = "offset + length overflow")] + fn test_slice_panics_on_offset_length_overflow() { + let data = ArrayData::builder(DataType::Int32) + .len(4) + .add_buffer(make_i32_buffer(4)) + .build() + .unwrap(); + let sliced = data.slice(1, 3); + + sliced.slice(1, usize::MAX); + } + + #[test] + fn test_typed_offsets_length_overflow() { + let data = ArrayData { + data_type: DataType::Binary, + len: usize::MAX, + offset: 0, + buffers: vec![Buffer::from_slice_ref([0_i32])], + child_data: vec![], + nulls: None, + }; + let err = data.typed_offsets::<i32>().unwrap_err(); + + assert_eq!( + err.to_string(), + format!( + "Invalid argument error: Length {} with offset 1 overflows usize for Binary", + usize::MAX + ) + ); + } + + #[test] + fn test_validate_typed_buffer_length_overflow() { + let data = ArrayData { + data_type: DataType::Binary, + len: 0, + offset: 2, + buffers: vec![Buffer::from_slice_ref([0_i32])], + child_data: vec![], + nulls: None, + }; + let err = data.typed_buffer::<i32>(0, usize::MAX).unwrap_err(); + + assert_eq!( + err.to_string(), + format!( + "Invalid argument error: Length {} with offset 2 overflows usize for Binary", + usize::MAX + ) + ); + } + + // Exercises ArrayData::try_new with len + offset overflowing + fn try_new_binary_length_offset_overflow() -> Result<ArrayData, ArrowError> { + ArrayData::try_new( + DataType::Binary, + usize::MAX, + None, + 1, + vec![ + Buffer::from_slice_ref([0_i32]), + Buffer::from_iter(std::iter::empty::<u8>()), + ], + vec![], + ) + } + + #[cfg(not(feature = "force_validate"))] + #[test] + fn test_try_new_length_offset_overflow() { + let err = try_new_binary_length_offset_overflow().unwrap_err(); + + assert_eq!( + err.to_string(), + format!( + "Invalid argument error: Length {} with offset 1 overflows usize for Binary", + usize::MAX + ) + ); + } + + #[cfg(feature = "force_validate")] + #[test] + #[should_panic( + expected = "Length 18446744073709551615 with offset 1 overflows usize for Binary" + )] + fn test_try_new_length_offset_overflow_force_validate() { + try_new_binary_length_offset_overflow().unwrap(); + } + #[test] fn test_equality() { let int_data = ArrayData::builder(DataType::Int32)
