Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Panic during drawing a calendar #616

Open
pskrgag opened this issue Jan 4, 2025 · 0 comments
Open

Panic during drawing a calendar #616

pskrgag opened this issue Jan 4, 2025 · 0 comments
Labels
bug Something isn't working

Comments

@pskrgag
Copy link

pskrgag commented Jan 4, 2025

Reproduces on current HEAD (54b06cd).

Steps to reproduce:

  1. Run taskwarrior-tui
  2. Press [ 2 times
  3. App panics

Backtrace:

Backtrace (most recent call first):
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ratatui-0.26.3/src/buffer/buffer.rs", line 137, in ratatui::buffer::buffer::Buffer::index_of
    debug_assert!(
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ratatui-0.26.3/src/buffer/buffer.rs", line 105, in ratatui::buffer::buffer::Buffer::get_mut
    let i = self.index_of(x, y);
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ratatui-0.26.3/src/buffer/buffer.rs", line 221, in ratatui::buffer::buffer::Buffer::set_stringn
    self.get_mut(x, y).set_symbol(symbol).set_style(style);
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ratatui-0.26.3/src/buffer/buffer.rs", line 191, in ratatui::buffer::buffer::Buffer::set_string
    self.set_stringn(x, y, string, usize::MAX, style);
  File "/home/paskripkin/Documents/git/taskwarrior-tui/src/calendar.rs", line 208, in <taskwarrior_tui::calendar::Calendar as ratatui::widgets::Widget>::render
    buf.set_string(x, y, s, style);
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ratatui-0.26.3/src/terminal/frame.rs", line 75, in ratatui::terminal::frame::Frame::render_widget
    widget.render(area, self.buffer);
  File "/home/paskripkin/Documents/git/taskwarrior-tui/src/app.rs", line 530, in taskwarrior_tui::app::TaskwarriorTui::draw_calendar
    f.render_widget(c, layout);
  File "/home/paskripkin/Documents/git/taskwarrior-tui/src/app.rs", line 454, in taskwarrior_tui::app::TaskwarriorTui::draw
    Mode::Calendar => self.draw_calendar(f, main_layout),
  File "/home/paskripkin/Documents/git/taskwarrior-tui/src/app.rs", line 383, in taskwarrior_tui::app::TaskwarriorTui::run::{{closure}}::{{closure}}
    terminal.draw(|f| self.draw(f))?;
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ratatui-0.26.3/src/terminal/terminal.rs", line 269, in ratatui::terminal::terminal::Terminal<B>::draw
    f(&mut frame);
  File "/home/paskripkin/Documents/git/taskwarrior-tui/src/app.rs", line 383, in taskwarrior_tui::app::TaskwarriorTui::run::{{closure}}
    terminal.draw(|f| self.draw(f))?;
  File "/home/paskripkin/Documents/git/taskwarrior-tui/src/main.rs", line 117, in taskwarrior_tui::tui_main::{{closure}}
    let r = app.run(&mut terminal).await;
  File "/home/paskripkin/Documents/git/taskwarrior-tui/src/main.rs", line 187, in taskwarrior_tui::main::{{closure}}
    .block_on(async { tui_main(report).await });
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/park.rs", line 281, in tokio::runtime::park::CachedParkThread::block_on::{{closure}}
    if let Ready(v) = crate::runtime::coop::budget(|| f.as_mut().poll(&mut cx)) {
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/coop.rs", line 107, in tokio::runtime::coop::with_budget
    f()
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/coop.rs", line 73, in tokio::runtime::coop::budget
    with_budget(Budget::initial(), f)
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/park.rs", line 281, in tokio::runtime::park::CachedParkThread::block_on
    if let Ready(v) = crate::runtime::coop::budget(|| f.as_mut().poll(&mut cx)) {
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/context/blocking.rs", line 66, in tokio::runtime::context::blocking::BlockingRegionGuard::block_on
    park.block_on(f)
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/scheduler/multi_thread/mod.rs", line 87, in tokio::runtime::scheduler::multi_thread::MultiThread::block_on::{{closure}}
    blocking.block_on(future).expect("failed to park thread")
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/context/runtime.rs", line 65, in tokio::runtime::context::runtime::enter_runtime
    return f(&mut guard.blocking);
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/scheduler/multi_thread/mod.rs", line 86, in tokio::runtime::scheduler::multi_thread::MultiThread::block_on
    crate::runtime::context::enter_runtime(handle, true, |blocking| {
  File "/home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/runtime.rs", line 349, in tokio::runtime::runtime::Runtime::block_on
    Scheduler::MultiThread(exec) => exec.block_on(&self.handle.inner, future),
  File "/home/paskripkin/Documents/git/taskwarrior-tui/src/main.rs", line 184, in taskwarrior_tui::main
    let r = tokio::runtime::Builder::new_multi_thread()

The application panicked (crashed).
  Trying to access position outside the buffer: x=38, y=77, area=Rect { x: 0, y: 0, width: 165, height: 77 }
in /home/paskripkin/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ratatui-0.26.3/src/buffer/buffer.rs, line 221
thread: main

Sort of analysis

Code panics here, since y > area.height

            if d.1 == Local::now().date_naive() {
              buf.set_string(x, y, s, self.today_style);
            } else {
              buf.set_string(x, y, s, style); <-- here
            }

Simple fix like:

--- a/src/calendar.rs
+++ b/src/calendar.rs
@@ -212,7 +212,7 @@ impl<'a> Widget for Calendar<'a> {
           moredays |= d.0.month() == d.1.month() || d.1 < d.0;
         }
         y += 1;
-        if !moredays {
+        if !moredays || y >= area.height {
           break;
         }
       }

fixes for me, but I am not sure if it's complete fix, since code is kinda not straightforward.

@pskrgag pskrgag added the bug Something isn't working label Jan 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant