Skip to content

String arguments should be CString #748

@Supreeeme

Description

@Supreeeme

If you pass XdgToplevel::set_title a String with embedded 0 bytes (which is valid for a String), you will get a panic with a backtrace that kinda looks like this:

thread 'main' panicked at ...
xdg.rs:138:5:
called `Result::unwrap()` on an `Err` value: NulError(<bytes>)
stack backtrace:
   0: rust_begin_unwind
   1: core::panicking::panic_fmt
   2: core::result::unwrap_failed
   3: <wayland_protocols::xdg::shell::generated::client::xdg_toplevel::XdgToplevel as wayland_client::Proxy>::write_request
   4: wayland_client::conn::Connection::send_request
   5: wayland_protocols::xdg::shell::generated::client::xdg_toplevel::XdgToplevel::set_title

This is a fairly obtuse error, but digging into the library, it appears this is because string arguments are converted to CStrings internally, with an unwrap:

vec![quote! { Argument::Str(#arg_name.map(|s| Box::new(std::ffi::CString::new(s).unwrap()))) }]

If wayland-scanner doesn't want to handle this error, then it makes no sense for String arguments to be String, when they should instead just be std::ffi::CString and leave it on callers to deal with constructing it.

Metadata

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