Auto merge of #3610 - marc0246:missing-error-kinds, r=RalfJung

Use `throw_unsup_format!` instead of returning `ENOTSUP` in the mmap shim

I noticed this while trying to use `mmap` with `PROT_NONE`, which resulted in this error message:
```
Os { code: 95, kind: Uncategorized, message: "<unknown errnum in strerror_r: 95>" }
```
cc `@saethlin`
This commit is contained in:
bors 2024-05-20 05:56:36 +00:00
commit 41c006e21a
2 changed files with 15 additions and 42 deletions

View file

@ -71,24 +71,27 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
throw_unsup_format!("Miri does not support file-backed memory mappings");
}
// POSIX says:
// [ENOTSUP]
// * MAP_FIXED or MAP_PRIVATE was specified in the flags argument and the implementation
// does not support this functionality.
// * The implementation does not support the combination of accesses requested in the
// prot argument.
//
// Miri doesn't support MAP_FIXED or any any protections other than PROT_READ|PROT_WRITE.
if flags & map_fixed != 0 || prot != prot_read | prot_write {
this.set_last_error(this.eval_libc("ENOTSUP"))?;
return Ok(this.eval_libc("MAP_FAILED"));
// Miri doesn't support MAP_FIXED.
if flags & map_fixed != 0 {
throw_unsup_format!(
"Miri does not support calls to mmap with MAP_FIXED as part of the flags argument",
);
}
// Miri doesn't support protections other than PROT_READ|PROT_WRITE.
if prot != prot_read | prot_write {
throw_unsup_format!(
"Miri does not support calls to mmap with protections other than \
PROT_READ|PROT_WRITE",
);
}
// Miri does not support shared mappings, or any of the other extensions that for example
// Linux has added to the flags arguments.
if flags != map_private | map_anonymous {
throw_unsup_format!(
"Miri only supports calls to mmap which set the flags argument to MAP_PRIVATE|MAP_ANONYMOUS"
"Miri only supports calls to mmap which set the flags argument to \
MAP_PRIVATE|MAP_ANONYMOUS",
);
}

View file

@ -69,36 +69,6 @@ fn test_mmap<Offset: Default>(
assert_eq!(ptr, libc::MAP_FAILED);
assert_eq!(Error::last_os_error().raw_os_error().unwrap(), libc::EINVAL);
let ptr = unsafe {
mmap(
ptr::without_provenance_mut(page_size * 64),
page_size,
libc::PROT_READ | libc::PROT_WRITE,
// We don't support MAP_FIXED
libc::MAP_PRIVATE | libc::MAP_ANONYMOUS | libc::MAP_FIXED,
-1,
Default::default(),
)
};
assert_eq!(ptr, libc::MAP_FAILED);
assert_eq!(Error::last_os_error().raw_os_error().unwrap(), libc::ENOTSUP);
// We don't support protections other than read+write
for prot in [libc::PROT_NONE, libc::PROT_EXEC, libc::PROT_READ, libc::PROT_WRITE] {
let ptr = unsafe {
mmap(
ptr::null_mut(),
page_size,
prot,
libc::MAP_PRIVATE | libc::MAP_ANONYMOUS,
-1,
Default::default(),
)
};
assert_eq!(ptr, libc::MAP_FAILED);
assert_eq!(Error::last_os_error().raw_os_error().unwrap(), libc::ENOTSUP);
}
// We report an error for mappings whose length cannot be rounded up to a multiple of
// the page size.
let ptr = unsafe {