The Unix implementation of `__rust_reallocate` in `liballoc_system` boils down to: ``` rust pub unsafe fn reallocate(ptr: *mut u8, old_size: usize, size: usize, align: usize) -> *mut u8 { if align <= MIN_ALIGN { libc::realloc(ptr as *mut libc::c_void, size as libc::size_t) as *mut u8 } else { let new_ptr = allocate(size, align); ptr::copy(ptr, new_ptr, cmp::min(size, old_size)); deallocate(ptr, old_size, align); new_ptr } } ``` The `else` branch of the conditional doesn't properly handle the case where `allocate` fails. For comparison's sake, the Windows implementation says: ``` rust pub unsafe fn reallocate(ptr: *mut u8, _old_size: usize, size: usize, align: usize) -> *mut u8 { if align <= MIN_ALIGN { HeapReAlloc(GetProcessHeap(), 0, ptr as LPVOID, size as SIZE_T) as *mut u8 } else { let header = get_header(ptr); let new = HeapReAlloc(GetProcessHeap(), 0, header.0 as LPVOID, (size + align) as SIZE_T) as *mut u8; if new.is_null() { return new; } align_ptr(new, align) } } ```