-
Notifications
You must be signed in to change notification settings - Fork 243
Closed
Description
I found this code which openly admits to doing OOB accesses:
compiler-builtins/src/mem/impls.rs
Lines 64 to 70 in 2a67ad7
// This will read (but won't use) bytes out of bound. | |
// cfg needed because not all targets will have atomic loads that can be lowered | |
// (e.g. BPF, MSP430), or provided by an external library (e.g. RV32I) | |
#[cfg(target_has_atomic_load_store = "ptr")] | |
let mut prev_word = core::intrinsics::atomic_load_unordered(src_aligned); | |
#[cfg(not(target_has_atomic_load_store = "ptr"))] | |
let mut prev_word = core::ptr::read_volatile(src_aligned); |
This code also looks suspicious, e.g. if this is used to implement 2-byte atomic accesses then there is OOB here:
compiler-builtins/src/arm_linux.rs
Lines 57 to 89 in 56172fc
// Generic atomic read-modify-write operation | |
unsafe fn atomic_rmw<T, F: Fn(u32) -> u32, G: Fn(u32, u32) -> u32>(ptr: *mut T, f: F, g: G) -> u32 { | |
let aligned_ptr = align_ptr(ptr); | |
let (shift, mask) = get_shift_mask(ptr); | |
loop { | |
let curval_aligned = intrinsics::atomic_load_unordered(aligned_ptr); | |
let curval = extract_aligned(curval_aligned, shift, mask); | |
let newval = f(curval); | |
let newval_aligned = insert_aligned(curval_aligned, newval, shift, mask); | |
if __kuser_cmpxchg(curval_aligned, newval_aligned, aligned_ptr) { | |
return g(curval, newval); | |
} | |
} | |
} | |
// Generic atomic compare-exchange operation | |
unsafe fn atomic_cmpxchg<T>(ptr: *mut T, oldval: u32, newval: u32) -> u32 { | |
let aligned_ptr = align_ptr(ptr); | |
let (shift, mask) = get_shift_mask(ptr); | |
loop { | |
let curval_aligned = intrinsics::atomic_load_unordered(aligned_ptr); | |
let curval = extract_aligned(curval_aligned, shift, mask); | |
if curval != oldval { | |
return curval; | |
} | |
let newval_aligned = insert_aligned(curval_aligned, newval, shift, mask); | |
if __kuser_cmpxchg(curval_aligned, newval_aligned, aligned_ptr) { | |
return oldval; | |
} | |
} | |
} |
I haven't done a thorough audit so there might be more. I found these by grepping for atomic_load_unordered
.
Metadata
Metadata
Assignees
Labels
No labels