Skip to content

InstanceId can be used to bypass Gd not being Send #886

Open
@lilizoey

Description

@lilizoey

Currently Gd does not implement Send, because it is unsound to send to another thread. However you can easily bypass this restriction by using InstanceId and calling Gd::try_from_instance_id().

Until we have a proper solution for multi-threaded code, this loophole should probably be available so that people who desperately need it can use it. But when we are going to support multi-threaded code, this loophole will need to be closed to ensure soundness.

My suggestion would be:

  • Make InstanceId not implement Send or Sync. This will make it impossible to bypass multi-threading by merely passing an InstanceId to another thread.
  • Make it impossible or unsafe to construct an InstanceId from a u64. This makes it so that you cant bypass the previous restriction by just passing the integer representation of an InstanceId to another thread.

This means we're effectively adding strict provenance to InstanceId. Where it is only safe to obtain an InstanceId which has a known provenance, and any attempt to create an InstanceId out of thin air would be library UB since it can potentially violate arbitrary restrictions.

I am not sure if it is possible to call try_from_instance_id another way, such as through Object::call(). If that is possible then this suggestion would likely mean that that would need to be made unsafe as well. That would be non-ideal, but if we are going to impose any extra soundness criteria on top of Godot it may be unavoidable.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugc: threadsRelated to multithreading in GodotubUndefined behavior

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions