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:
commit
1a87926a31
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user