Skip to content

Commit 83f3802

Browse files
committed
Fix large offset/lengths on 32-bit platforms
1 parent 43ef3fe commit 83f3802

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

src/lib.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,14 @@ impl MmapOptions {
119119
/// Returns the configured length, or the length of the provided file.
120120
fn get_len(&self, file: &File) -> Result<usize> {
121121
self.len.map(Ok).unwrap_or_else(|| {
122-
let len = file.metadata()?.len();
122+
let len = file.metadata()?.len() - self.offset;
123123
if len > (usize::MAX as u64) {
124124
return Err(Error::new(
125125
ErrorKind::InvalidData,
126-
"file length overflows usize",
126+
"memory map length overflows usize",
127127
));
128128
}
129-
Ok((len - self.offset) as usize)
129+
Ok(len as usize)
130130
})
131131
}
132132

@@ -820,14 +820,11 @@ mod test {
820820
let len = 5432;
821821
file.set_len(offset + len as u64).unwrap();
822822

823-
// Check auto-length mmap. The file length exceeds 4GiB, so this fails on 32-bit platforms.
824-
#[cfg(target_pointer_width = "64")]
825-
{
826-
let mmap = unsafe { MmapOptions::new().offset(offset).map_mut(&file).unwrap() };
827-
assert_eq!(len, mmap.len());
828-
}
823+
// Check inferred length mmap.
824+
let mmap = unsafe { MmapOptions::new().offset(offset).map_mut(&file).unwrap() };
825+
assert_eq!(len, mmap.len());
829826

830-
// Check explicit length mmap. This should succeed on any platform.
827+
// Check explicit length mmap.
831828
let mut mmap = unsafe {
832829
MmapOptions::new()
833830
.offset(offset)

0 commit comments

Comments
 (0)