lewismosciski opened a new issue, #9543:
URL: https://github.com/apache/arrow-rs/issues/9543

   Hi there!
   
   We scanned the most popular libraries on crates.io and found some memory 
safety bugs in this library.
   
   ## util::bit_mask::set_bits
   
   
   ### PoC
   ```rust
   use arrow_buffer::bit_mask::set_bits;
   
   fn main() {
       // Tiny buffers so any huge computed index is out-of-bounds.
       let data = [0u8; 1];
       let mut write_data = [0u8; 1];
   
       // Choose values so (offset_read + len) wraps to a small number in 
release builds.
       // offset_read = usize::MAX - 7, len = 8 => wraps to 0.
       // This can bypass `assert!(offset_read + len <= data.len() * 8)`.
       let offset_write: usize = 0;
       let offset_read: usize = usize::MAX - 7;
       let len: usize = 8;
   
       // Triggers unsafe internal `get_unchecked` with a massive `read_byte = 
offset_read / 8`.
       let _nulls = set_bits(&mut write_data, &data, offset_write, offset_read, 
len);
   
       // Keep the result observable so the call isn't optimized away.
       std::hint::black_box(write_data);
   }
   ```
   
   ### Miri Output
   ```text
   error: Undefined Behavior: in-bounds pointer arithmetic failed: attempting 
to offset pointer by 2305843009213693951 bytes, but got alloc242 which is only 
1 byte from the end of the allocation
      --> 
/home/ccuu/Desktop/llm-detector/experiments/cache/crates_src/arrow-buffer/58.0.0/arrow-buffer-58.0.0/src/util/bit_mask.rs:135:24
       |
   135 |     let src = unsafe { data.as_ptr().add(offset) };
       |                        ^^^^^^^^^^^^^^^^^^^^^^^^^ Undefined Behavior 
occurred here
       |
       = help: this indicates a bug in the program: it performed an invalid 
operation, and caused Undefined Behavior
       = help: see 
https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html 
for further information
   help: alloc242 was allocated here:
      --> src/main.rs:9:9
       |
     9 |     let data = [0u8; 1];
       |         ^^^^
       = note: BACKTRACE (of the first span):
       = note: inside `arrow_buffer::bit_mask::read_bytes_to_u64` at 
/home/ccuu/Desktop/llm-detector/experiments/cache/crates_src/arrow-buffer/58.0.0/arrow-buffer-58.0.0/src/util/bit_mask.rs:135:24:
 135:49
       = note: inside `arrow_buffer::bit_mask::set_upto_64bits` at 
/home/ccuu/Desktop/llm-detector/experiments/cache/crates_src/arrow-buffer/58.0.0/arrow-buffer-58.0.0/src/util/bit_mask.rs:116:30:
 116:71
       = note: inside `arrow_buffer::bit_mask::set_bits` at 
/home/ccuu/Desktop/llm-detector/experiments/cache/crates_src/arrow-buffer/58.0.0/arrow-buffer-58.0.0/src/util/bit_mask.rs:44:13:
 50:14
   note: inside `main`
      --> src/main.rs:20:18
       |
    20 |     let _nulls = set_bits(&mut write_data, &data, offset_write, 
offset_read, len);
       |                  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   
   note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` 
for a verbose backtrace
   
   error: aborting due to 1 previous error
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to