atanunq / viu

Terminal image viewer with native support for iTerm and Kitty
MIT License
2.53k stars 56 forks source link

panics under eshell #61

Open codesections opened 3 years ago

codesections commented 3 years ago

Thanks for the wonderful tool! I encountered a panic when trying to use viu with eshell. The panic still happened when I ran emacs -Q (which runs with a blank config), so it wasn't triggered by anything in my configuration.

I tested in CLI emacs inside Alacritty and Kitty and ran into the same error. (I didn't test GUI emacs, since it can display images by itself).

The backtrace is below:

thread 'main' panicked at 'Image index (0, 1) out of bounds (0, 2)', /home/dsock/.cargo/registry/src/github.com-1ecc6299db9ec823/image-0.23.12/./src/buffer.rs:723:21
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:78
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:59
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1076
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1537
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:62
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:49
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:198
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:218
  10: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:486
  11: rust_begin_unwind
             at src/libstd/panicking.rs:388
  12: std::panicking::begin_panic_fmt
             at src/libstd/panicking.rs:342
  13: <image::dynimage::DynamicImage as image::image::GenericImageView>::get_pixel
  14: <viuer::printer::block::BlockPrinter as viuer::printer::Printer>::print
  15: viuer::printer::Printer::print_from_file
  16: viuer::print_from_file
  17: viu::app::view_file
  18: viu::app::run
  19: viu::main
  20: std::rt::lang_start::{{closure}}
  21: std::rt::lang_start_internal::{{closure}}
             at src/libstd/rt.rs:52
  22: std::panicking::try::do_call
             at src/libstd/panicking.rs:297
  23: std::panicking::try
             at src/libstd/panicking.rs:274
  24: std::panic::catch_unwind
             at src/libstd/panic.rs:394
  25: std::rt::lang_start_internal
             at src/libstd/rt.rs:51
  26: main
  27: __libc_start_main
  28: _start
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
atanunq commented 3 years ago

Hi, thanks for the report. It looks like the root cause stems from a call to crossterm::terminal::size. It successfully returns an invalid value, (0, 0), for terminal (width, height). Because of that return value, on the viu side (viuer actually) incorrectly resizes the image to (0, 2) and tries to iterate over its pixels. I should add edge case checks, but in the best case you will get a (1, 1) image displayed until the size function returns the correct value. I have zero knowledge about the emacs/eshell environment so I cannot really help with fixing this upstream, sorry.

azzamsa commented 3 years ago

Yes, same here.

/foo $ RUST_BACKTRACE=1 viu kk.jpg 
thread 'main' panicked at 'Image index (0, 1) out of bounds (0, 2)', /home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/image-0.23.12/./src/buffer.rs:723:21
stack backtrace:
   0: rust_begin_unwind
             at /rustc/e1884a8e3c3e813aada8254edfa120e85bf5ffca/library/std/src/panicking.rs:495:5
   1: std::panicking::begin_panic_fmt
             at /rustc/e1884a8e3c3e813aada8254edfa120e85bf5ffca/library/std/src/panicking.rs:437:5
   2: <image::dynimage::DynamicImage as image::image::GenericImageView>::get_pixel
   3: <viuer::printer::block::BlockPrinter as viuer::printer::Printer>::print
   4: viuer::printer::Printer::print_from_file
   5: viuer::print_from_file
   6: viu::app::view_file
   7: viu::app::run
   8: viu::main
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
/foo $ 

Other similar app works well:

/foo $ sxiv kk.jpg
/foo $ feh kk.jpg
/foo $ display kk.jpg