This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch 57_maintenance
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/57_maintenance by this push:
     new 25cc1ac28c [57_maintenance] fix: ensure `BufferBuilder::truncate` 
doesn't overset length (#9288) (#9311)
25cc1ac28c is described below

commit 25cc1ac28ccdf2fffb844380d2dde1a1966b5ae4
Author: Andrew Lamb <[email protected]>
AuthorDate: Mon Feb 2 10:05:01 2026 -0500

    [57_maintenance] fix: ensure `BufferBuilder::truncate` doesn't overset 
length (#9288) (#9311)
    
    - Part of https://github.com/apache/arrow-rs/issues/9240
    - Related to https://github.com/apache/arrow-rs/issues/9286
    
    This is a backport of the following PR to the 57 line
    - https://github.com/apache/arrow-rs/pull/9288 from @Jefffrey
    
    Co-authored-by: Jeffrey Vo <[email protected]>
---
 arrow-buffer/src/builder/mod.rs | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/arrow-buffer/src/builder/mod.rs b/arrow-buffer/src/builder/mod.rs
index abe510bdab..d809b0939f 100644
--- a/arrow-buffer/src/builder/mod.rs
+++ b/arrow-buffer/src/builder/mod.rs
@@ -322,7 +322,7 @@ impl<T: ArrowNativeType> BufferBuilder<T> {
     #[inline]
     pub fn truncate(&mut self, len: usize) {
         self.buffer.truncate(len * std::mem::size_of::<T>());
-        self.len = len;
+        self.len = self.len.min(len);
     }
 
     /// # Safety
@@ -418,4 +418,16 @@ mod tests {
         builder.extend([3, 4]);
         assert_eq!(builder.len(), 4);
     }
+
+    #[test]
+    fn truncate_safety() {
+        let mut builder = BufferBuilder::from(vec![40, -63, 90]);
+        assert_eq!(builder.len(), 3);
+        builder.truncate(151);
+        assert_eq!(builder.len(), 3);
+        builder.advance(219);
+        assert_eq!(builder.len(), 222);
+        let slice = builder.as_slice_mut();
+        assert_eq!(slice.len(), 222);
+    }
 }

Reply via email to