diff options
| author | Jonas Schievink <jonasschievink@gmail.com> | 2020-10-08 23:23:12 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-08 23:23:12 +0200 |
| commit | b1e856ad43d9044349987dc692652f90ec075d7d (patch) | |
| tree | 88c8d272f6e10ac4ab5c8da19b998d7c187cba13 | |
| parent | 7edb7e7ec00df6793ea9d231b3b40f6b680a0bcd (diff) | |
| parent | ea206f2c5af8597771347ecc95e76c258b710181 (diff) | |
| download | rust-b1e856ad43d9044349987dc692652f90ec075d7d.tar.gz rust-b1e856ad43d9044349987dc692652f90ec075d7d.zip | |
Rollup merge of #77663 - HeroicKatora:regression-tests-27675-object-safe, r=Aaron1011
Add compile fail test for issue 27675 A recently merged PR (#73905) strengthened the checks on bounds of associated items. This rejects the attack path of #27675 which consisted of constructing a `dyn Trait<Item=T>` where `T` would not fulfill the bounds required on `Item` of the `Trait` behind the dyn object. This regression test, extracted from [the weaponized instance](https://github.com/rust-lang/rust/issues/27675#issuecomment-696956878), checks that this is rejected.
| -rw-r--r-- | src/test/compile-fail/issue-27675-unchecked-bounds.rs | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/test/compile-fail/issue-27675-unchecked-bounds.rs b/src/test/compile-fail/issue-27675-unchecked-bounds.rs new file mode 100644 index 00000000000..1cfc2304531 --- /dev/null +++ b/src/test/compile-fail/issue-27675-unchecked-bounds.rs @@ -0,0 +1,19 @@ +/// The compiler previously did not properly check the bound of `From` when it was used from type +/// of the dyn trait object (use in `copy_any` below). Since the associated type is under user +/// control in this usage, the compiler could be tricked to believe any type implemented any trait. +/// This would ICE, except for pure marker traits like `Copy`. It did not require providing an +/// instance of the dyn trait type, only name said type. +trait Setup { + type From: Copy; +} + +fn copy<U: Setup + ?Sized>(from: &U::From) -> U::From { + *from +} + +pub fn copy_any<T>(t: &T) -> T { + copy::<dyn Setup<From=T>>(t) + //~^ ERROR the trait bound `T: Copy` is not satisfied +} + +fn main() {} |
