about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-05-14 15:58:33 +0000
committerbors <bors@rust-lang.org>2019-05-14 15:58:33 +0000
commitf59c71eb8ed808347c1e4245b842d673c75daeb6 (patch)
treec0aca59bab1924d08e5161737d5d1b471f6722c2 /src/libstd
parent80e7cde2238e837a9d6a240af9a3253f469bb2cf (diff)
parent3db667a81944c14f0933522560822fc20809c63f (diff)
downloadrust-f59c71eb8ed808347c1e4245b842d673c75daeb6.tar.gz
rust-f59c71eb8ed808347c1e4245b842d673c75daeb6.zip
Auto merge of #60787 - alexcrichton:error-type-id-destabilize-master, r=pietroalbini
Destabilize the `Error::type_id` function

This commit destabilizes the `Error::type_id` function in the standard library.
This does so by effectively reverting #58048, restoring the `#[unstable]`
attribute. The security mailing list has recently been notified of a
vulnerability relating to the stabilization of this function. First stabilized
in Rust 1.34.0, a stable function here allows users to implement a custom
return value for this function:

    struct MyType;

    impl Error for MyType {
	fn type_id(&self) -> TypeId {
	    // Enable safe casting to `String` by accident.
	    TypeId::of::<String>()
	}
    }

This, when combined with the `Error::downcast` family of functions, allows
safely casting a type to any other type, clearly a memory safety issue! A
formal announcement has been made to the [security mailing list](https://groups.google.com/forum/#!topic/rustlang-security-announcements/aZabeCMUv70) as well as [the blog](https://blog.rust-lang.org/2019/05/13/Security-advisory.html)

This commit simply destabilizes the `Error::type_id` which, although breaking
for users since Rust 1.34.0, is hoped to have little impact and has been deemed
sufficient to mitigate this issue for the stable channel. The long-term fate of
the `Error::type_id` API will be discussed at #60784.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/error.rs5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/libstd/error.rs b/src/libstd/error.rs
index 081fff0562b..7cb830e751a 100644
--- a/src/libstd/error.rs
+++ b/src/libstd/error.rs
@@ -197,7 +197,10 @@ pub trait Error: Debug + Display {
     fn source(&self) -> Option<&(dyn Error + 'static)> { None }
 
     /// Gets the `TypeId` of `self`
-    #[stable(feature = "error_type_id", since = "1.34.0")]
+    #[doc(hidden)]
+    #[unstable(feature = "error_type_id",
+               reason = "this is memory unsafe to override in user code",
+               issue = "60784")]
     fn type_id(&self) -> TypeId where Self: 'static {
         TypeId::of::<Self>()
     }