Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CFI: Fix many vtable-related problems #121962

Closed
wants to merge 13 commits into from
Closed

Commits on Mar 6, 2024

  1. Introduce trait_obj_ty query

    This query computes the trait object, complete with associated type
    projections for its supertraits, from a trait ref.
    
    This is intended for use by CFI shimming.
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    de2edc3 View commit details
    Browse the repository at this point in the history
  2. Refactor visiting instance_def

    In preparation to add recursive instance_defs, move this logic to its
    own convenience method.
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    754c789 View commit details
    Browse the repository at this point in the history
  3. Refactor fmt_instance

    Factored out to minimize the amount of noise in the main CfiShim
    defining patch.
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    28bdb59 View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    ff7fb59 View commit details
    Browse the repository at this point in the history
  5. CFI: Introduce CFI shims

    Indirect calls through vtables (trait objects or drop_in_place) expect
    to have a type based on `dyn Trait` at the call-site. The actual
    implementations have types based on `MyImplType`. These shims allow the
    insertion of an explicit cast at the beginning of any instance, allowing
    a different type to be assigned. These shims function for both CFI and
    KCFI, as they have a single principal type.
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    2102551 View commit details
    Browse the repository at this point in the history
  6. CFI: Apply CFI shims to drops

    Fixes: 118761
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    5cca174 View commit details
    Browse the repository at this point in the history
  7. CFI: Enable vtable shimming

    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    646befe View commit details
    Browse the repository at this point in the history
  8. Revert "CFI: Fix SIGILL reached via trait objects"

    We no longer need the special instance resolution this added, and it can
    be broken in edge cases (specifically with a FnPtr shim, which will
    cause the calculation of fn_abi to fail).
    
    * We keep the Clone impls it added, because they have since become used
      by other portions of the compiler.
    * Add a test for the address-taken calls that this previously broke.
    
    This reverts commit 7c7b22e.
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    ada412a View commit details
    Browse the repository at this point in the history
  9. CFI: Skip non-passed arguments

    Rust will occasionally rely on fn((), X) -> Y being compatible with
    fn(X) -> Y, since () is a non-passed argument. Relax CFI by choosing not
    to encode non-passed arguments.
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    252fcd1 View commit details
    Browse the repository at this point in the history
  10. CFI: Handle dyn with no principal

    In user-facing Rust, `dyn` always has at least one predicate following
    it. Unfortunately, because we filter out marker traits and `dyn Sync`
    is, for example, legal, this results in us having `dyn` types with no
    predicates on occasion. This patch handles cases where there are no
    predicates in a `dyn` type.
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    b30fedb View commit details
    Browse the repository at this point in the history
  11. CFI: Support self_cell-like recursion

    Current `transform_ty` attempts to avoid cycles when normalizing
    `#[repr(transparent)]` types to their interior, but runs afoul of this
    pattern used in `self_cell`:
    
    ```
    struct X<T> {
      x: u8,
      p: PhantomData<T>,
    }
    
     #[repr(transparent)]
    struct Y(X<Y>);
    ```
    
    When attempting to normalize Y, it will still cycle indefinitely. By
    using a types-visited list, this will instead get expanded exactly
    one layer deep to X<Y>, and then stop, not attempting to normalize `Y`
    any further.
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    09d1d3e View commit details
    Browse the repository at this point in the history
  12. CFI: Generate super vtables explicitly

    CFI shimming means they're not gauranteed to be pre-generated.
    Traditionally, the base vtable has all the elements of the supertrait
    vtable, and so visiting the base vtable implies you don't need to visit
    the supertrait vtable. However, with CFI the base vtable entries will
    have invocation type `dyn Child`, and the parent vtable will have
    invocation type `dyn Parent`, so they aren't actually the same instance,
    and both must be visited.
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    4912a32 View commit details
    Browse the repository at this point in the history
  13. CFI: Strip auto traits from Virtual receivers

    As the instance being called is behind a vtable, it cannot depend on
    auto traits on the receiver (unless the principal trait requires them,
    in which case the additional constraint is not needed).
    
    Removing this causes the type signature of the `Virtual` instance to
    match the type signature of the `CfiShim`-wrapped entry in the vtable.
    maurer committed Mar 6, 2024
    Configuration menu
    Copy the full SHA
    50a0a86 View commit details
    Browse the repository at this point in the history