KCFI: Use legal charset in shim encoding

To separate `ReifyReason::FnPtr` from `ReifyReason::VTable`, we
hyphenated the shims. Hyphens are not actually legal, but underscores
are, so use those instead.
This commit is contained in:
Matthew Maurer 2024-04-08 20:42:18 +00:00
parent ab3dba92db
commit 233d94e72f
2 changed files with 32 additions and 2 deletions

View File

@ -45,8 +45,8 @@ pub(super) fn mangle<'tcx>(
ty::InstanceDef::ThreadLocalShim(_) => Some("tls"),
ty::InstanceDef::VTableShim(_) => Some("vtable"),
ty::InstanceDef::ReifyShim(_, None) => Some("reify"),
ty::InstanceDef::ReifyShim(_, Some(ReifyReason::FnPtr)) => Some("reify-fnptr"),
ty::InstanceDef::ReifyShim(_, Some(ReifyReason::Vtable)) => Some("reify-vtable"),
ty::InstanceDef::ReifyShim(_, Some(ReifyReason::FnPtr)) => Some("reify_fnptr"),
ty::InstanceDef::ReifyShim(_, Some(ReifyReason::Vtable)) => Some("reify_vtable"),
ty::InstanceDef::ConstructCoroutineInClosureShim { .. }
| ty::InstanceDef::CoroutineKindShim { .. } => Some("fn_once"),

View File

@ -0,0 +1,30 @@
// Check KCFI extra mangling works correctly on v0
//@ needs-sanitizer-kcfi
//@ no-prefer-dynamic
//@ compile-flags: -C panic=abort -Zsanitizer=kcfi -C symbol-mangling-version=v0
//@ build-pass
trait Foo {
fn foo(&self);
}
struct Bar;
impl Foo for Bar {
fn foo(&self) {}
}
struct Baz;
impl Foo for Baz {
#[track_caller]
fn foo(&self) {}
}
fn main() {
// Produces `ReifyShim(_, ReifyReason::FnPtr)`
let f: fn(&Bar) = Bar::foo;
f(&Bar);
// Produces `ReifyShim(_, ReifyReason::Vtable)`
let v: &dyn Foo = &Baz as _;
v.foo();
}