1Password / arboard

A clipboard for Rust

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Gracefully return an error instead of panicking in non-X11 contexts

jonasmalacofilho opened this issue · comments

If this crate is used in a non-X11 Linux context, Cliboard::get_text() double panics. Instead, I think an error should be returned from Clipboard::new() if it's not possible to connect to a X11 server.

I'd be happy to implement this change, but since it will move the initialization to an earlier time, I thought it would be wise to first ask if you have any concerns or objections.


First panic:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ClosedParseErr', src/x11_clipboard.rs:98:57
stack backtrace:
   0: rust_begin_unwind
             at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:475
   1: core::panicking::panic_fmt
             at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/panicking.rs:85
   2: core::option::expect_none_failed
             at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/option.rs:1221
   3: core::result::Result<T,E>::unwrap
             at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/result.rs:973
   4: arboard::x11_clipboard::LockedObjects::new
             at ./src/x11_clipboard.rs:98
   5: arboard::x11_clipboard::ensure_lo_initialized
             at ./src/x11_clipboard.rs:1173
   6: arboard::x11_clipboard::X11ClipboardContext::get_text
             at ./src/x11_clipboard.rs:1218
   7: arboard::Clipboard::get_text
             at ./src/lib.rs:65
   8: hello_world::main
             at ./examples/hello_world.rs:5
   9: core::ops::function::FnOnce::call_once
             at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Second panic:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "PoisonError { inner: .. }"', src/x11_clipboard.rs:501:51
stack backtrace:
   0:     0x560ad3feeb00 - std::backtrace_rs::backtrace::libunwind::trace::h577ea05e9ca4629a
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/../../backtrace/src/backtrace/libunwind.rs:96
   1:     0x560ad3feeb00 - std::backtrace_rs::backtrace::trace_unsynchronized::h50b9b72b84c7dd56
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/../../backtrace/src/backtrace/mod.rs:66
   2:     0x560ad3feeb00 - std::sys_common::backtrace::_print_fmt::h6541cf9823837fac
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:79
   3:     0x560ad3feeb00 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::hf64fbff071026df5
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:58
   4:     0x560ad4008f7c - core::fmt::write::h9ddafa4860d8adff
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/fmt/mod.rs:1082
   5:     0x560ad3fed017 - std::io::Write::write_fmt::h1d2ee292d2b65481
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/io/mod.rs:1514
   6:     0x560ad3ff0de0 - std::sys_common::backtrace::_print::ha25f9ff5080d886d
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:61
   7:     0x560ad3ff0de0 - std::sys_common::backtrace::print::h213e8aa8dc5405c0
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:48
   8:     0x560ad3ff0de0 - std::panicking::default_hook::{{closure}}::h6482fae49ef9d963
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:200
   9:     0x560ad3ff0b2c - std::panicking::default_hook::he30ad7589e0970f9
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:219
  10:     0x560ad3ff1443 - std::panicking::rust_panic_with_hook::haa1ed36ada4ffb03
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:569
  11:     0x560ad3ff1019 - std::panicking::begin_panic_handler::{{closure}}::h7001af1bb21aeaeb
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:476
  12:     0x560ad3feef8c - std::sys_common::backtrace::__rust_end_short_backtrace::h39910f557f5f2367
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:153
  13:     0x560ad3ff0fd9 - rust_begin_unwind
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:475
  14:     0x560ad40082a1 - core::panicking::panic_fmt::h4e2659771ebc78eb
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/panicking.rs:85
  15:     0x560ad40080c3 - core::option::expect_none_failed::h448b58a024c2c33a
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/option.rs:1221
  16:     0x560ad3f6e040 - core::result::Result<T,E>::unwrap::h687c87c3f313b615
                               at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/result.rs:973
  17:     0x560ad3f5d7fe - arboard::x11_clipboard::Manager::destruct::hd0e565fd5595762c
                               at /home/jonas/Code/experiments/rust/clipboard/arboard/src/x11_clipboard.rs:501
  18:     0x560ad3f521ef - <arboard::x11_clipboard::X11ClipboardContext as core::ops::drop::Drop>::drop::h307ccff1f5befb5d
                               at /home/jonas/Code/experiments/rust/clipboard/arboard/src/x11_clipboard.rs:1205
  19:     0x560ad3f4e526 - core::ptr::drop_in_place::hf42d2093737883dc
                               at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:184
  20:     0x560ad3f4e4fe - core::ptr::drop_in_place::hab210301fc93f3d4
                               at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:184
  21:     0x560ad3f4e1fb - hello_world::main::h844a495b302b237f
                               at /home/jonas/Code/experiments/rust/clipboard/arboard/examples/hello_world.rs:10
  22:     0x560ad3f4e49b - core::ops::function::FnOnce::call_once::h13d94cf6f0dabc3e
                               at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227
  23:     0x560ad3f4e43e - std::sys_common::backtrace::__rust_begin_short_backtrace::hce407c5b19206a5a
                               at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/backtrace.rs:137
  24:     0x560ad3f4e981 - std::rt::lang_start::{{closure}}::h2d710c588bfdbe82
                               at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:66
  25:     0x560ad3ff1841 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::h6a3209f124be2235
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/ops/function.rs:259
  26:     0x560ad3ff1841 - std::panicking::try::do_call::h88ce358792b64df0
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:373
  27:     0x560ad3ff1841 - std::panicking::try::h6311c259678e50fc
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:337
  28:     0x560ad3ff1841 - std::panic::catch_unwind::h56c5716807d659a1
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panic.rs:379
  29:     0x560ad3ff1841 - std::rt::lang_start_internal::h73711f37ecfcb277
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/rt.rs:51
  30:     0x560ad3f4e957 - std::rt::lang_start::hee4923ac0b96e659
                               at /home/jonas/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:65
  31:     0x560ad3f4e42a - main
  32:     0x7f5d6a551152 - __libc_start_main
  33:     0x560ad3f4e09e - _start
  34:                0x0 - <unknown>
thread panicked while panicking. aborting.

I've never encountered this but I image that this could be relevant in a test environment. Either way this would be a very useful enhancement, I have no objections at all.

Should this be waited on, for the next release, or should I release a new version with your GNOME fix as soon as I can?

While there's no need to rush, I think releasing the GNOME1 fix shouldn't be blocked by this one. The problems are orthogonal, and users are more likely to run into that one.

1 Based on the clip issue, #4 may also affect KDE.

Is this still an issue? https://github.com/ArturKovacs/arboard/pull/13 seems to have removed all the unwraps in the X11 implementation so I would assume this now works as expected.

Thank you, @mathieulj for pointing that out.

I tested this by switching to a no-gui terminal (Ctrl+Alt+F4 on Ubuntu) and running cargo test on arboard. I got the following error returned form Clipboard::new():

Unknown { .. } - "Unknown error while interacting with the clipboard: Display parsing error"

So with that, I'm closing this. Please let me know if this should be re-opened for any reason.