Skip to content

UB in new_texture if newTextureWithDescriptor fails? #284

Open
@jesdazrez

Description

I was taking a look at the method and noticed it doesn't check what the newTextureWithDescriptor msg_send! returns.

According to the docs that call can return:

A new MTLTexture instance if the method completed successfully; otherwise nil.

The metal::Texture type wraps a NonNull<_> value (from cargo expand texture):

/// See <https://developer.apple.com/documentation/metal/mtltexture>
pub enum MTLTexture {}
#[repr(transparent)]
pub struct Texture(::foreign_types::export::NonNull<MTLTexture>);

So when that call fails new_texture will put a null ptr in a NonNull which is UB:

pub fn new_texture(&self, descriptor: &TextureDescriptorRef) -> Texture {
    unsafe { msg_send![self, newTextureWithDescriptor: descriptor] }
}

Seems like there's people already hitting those cases and wgpu now checks if the wrapped ptr is null, but that doesn't deal with the UB.

Let me know if I'm missing something, otherwise I can create a PR to perform the check and make create_texture return an Option<Texture>

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions