Skip to content

Commit 0c235ed

Browse files
committed
Destabilize the Error::type_id function
This commit destabilizes the `Error::type_id` function in the standard library. This does so by effectively reverting rust-lang#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 security announcement will be shortly posted to the security mailing list as well as the Rust Blog, and when those links are available they'll be filled in for this PR as well. 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 rust-lang#60784.
1 parent fc50f32 commit 0c235ed

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

src/libstd/error.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,10 @@ pub trait Error: Debug + Display {
196196
fn source(&self) -> Option<&(dyn Error + 'static)> { None }
197197

198198
/// Gets the `TypeId` of `self`
199-
#[stable(feature = "error_type_id", since = "1.34.0")]
199+
#[doc(hidden)]
200+
#[unstable(feature = "error_type_id",
201+
reason = "this is memory unsafe to override in user code",
202+
issue = "60784")]
200203
fn type_id(&self) -> TypeId where Self: 'static {
201204
TypeId::of::<Self>()
202205
}

0 commit comments

Comments
 (0)