Auto merge of #2460 - LegNeato:sysconf, r=RalfJung

Add additional raw error mappings for the nightly `io_error_more` feature

Some crates are using nightly and failing when mapping these errors,
for example <https://miri.saethlin.dev/?crate=remove_dir_all&version=0.7.0>:

```
error: unsupported operation: io error NotADirectory cannot be translated into a raw os error
    --> /root/.rustup/toolchains/miri/lib/rustlib/src/rust/library/std/src/sys/unix/fs.rs:1203:19
```
This commit is contained in:
bors 2022-08-03 15:56:13 +00:00
commit 1a87926a31

View File

@ -23,26 +23,51 @@
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {} impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {}
const UNIX_IO_ERROR_TABLE: &[(std::io::ErrorKind, &str)] = { // This mapping should match `decode_error_kind` in
// <https://github.com/rust-lang/rust/blob/master/library/std/src/sys/unix/mod.rs>.
const UNIX_IO_ERROR_TABLE: &[(&str, std::io::ErrorKind)] = {
use std::io::ErrorKind::*; use std::io::ErrorKind::*;
&[ &[
(ConnectionRefused, "ECONNREFUSED"), ("E2BIG", ArgumentListTooLong),
(ConnectionReset, "ECONNRESET"), ("EADDRINUSE", AddrInUse),
(PermissionDenied, "EPERM"), ("EADDRNOTAVAIL", AddrNotAvailable),
(BrokenPipe, "EPIPE"), ("EBUSY", ResourceBusy),
(NotConnected, "ENOTCONN"), ("ECONNABORTED", ConnectionAborted),
(ConnectionAborted, "ECONNABORTED"), ("ECONNREFUSED", ConnectionRefused),
(AddrNotAvailable, "EADDRNOTAVAIL"), ("ECONNRESET", ConnectionReset),
(AddrInUse, "EADDRINUSE"), ("EDEADLK", Deadlock),
(NotFound, "ENOENT"), ("EDQUOT", FilesystemQuotaExceeded),
(Interrupted, "EINTR"), ("EEXIST", AlreadyExists),
(InvalidInput, "EINVAL"), ("EFBIG", FileTooLarge),
(InvalidFilename, "ENAMETOOLONG"), ("EHOSTUNREACH", HostUnreachable),
(TimedOut, "ETIMEDOUT"), ("EINTR", Interrupted),
(AlreadyExists, "EEXIST"), ("EINVAL", InvalidInput),
(WouldBlock, "EWOULDBLOCK"), ("EISDIR", IsADirectory),
(DirectoryNotEmpty, "ENOTEMPTY"), ("ELOOP", FilesystemLoop),
(FilesystemLoop, "ELOOP"), ("ENOENT", NotFound),
("ENOMEM", OutOfMemory),
("ENOSPC", StorageFull),
("ENOSYS", Unsupported),
("EMLINK", TooManyLinks),
("ENAMETOOLONG", InvalidFilename),
("ENETDOWN", NetworkDown),
("ENETUNREACH", NetworkUnreachable),
("ENOTCONN", NotConnected),
("ENOTDIR", NotADirectory),
("ENOTEMPTY", DirectoryNotEmpty),
("EPIPE", BrokenPipe),
("EROFS", ReadOnlyFilesystem),
("ESPIPE", NotSeekable),
("ESTALE", StaleNetworkFileHandle),
("ETIMEDOUT", TimedOut),
("ETXTBSY", ExecutableFileBusy),
("EXDEV", CrossesDevices),
// The following have two valid options. We have both for the forwards mapping; only the
// first one will be used for the backwards mapping.
("EPERM", PermissionDenied),
("EACCES", PermissionDenied),
("EWOULDBLOCK", WouldBlock),
("EAGAIN", WouldBlock),
] ]
}; };
@ -554,7 +579,7 @@ fn io_error_to_errnum(
let this = self.eval_context_ref(); let this = self.eval_context_ref();
let target = &this.tcx.sess.target; let target = &this.tcx.sess.target;
if target.families.iter().any(|f| f == "unix") { if target.families.iter().any(|f| f == "unix") {
for &(kind, name) in UNIX_IO_ERROR_TABLE { for &(name, kind) in UNIX_IO_ERROR_TABLE {
if err_kind == kind { if err_kind == kind {
return this.eval_libc(name); return this.eval_libc(name);
} }
@ -592,7 +617,7 @@ fn errnum_to_io_error(
let target = &this.tcx.sess.target; let target = &this.tcx.sess.target;
if target.families.iter().any(|f| f == "unix") { if target.families.iter().any(|f| f == "unix") {
let errnum = errnum.to_i32()?; let errnum = errnum.to_i32()?;
for &(kind, name) in UNIX_IO_ERROR_TABLE { for &(name, kind) in UNIX_IO_ERROR_TABLE {
if errnum == this.eval_libc_i32(name)? { if errnum == this.eval_libc_i32(name)? {
return Ok(kind); return Ok(kind);
} }