🔴 [H9] 运行时 panic/error 无终端恢复保护 #9

Closed
opened 2026-06-03 13:52:51 +08:00 by dailz · 1 comment
Owner

文件: tui/main.rs:33-51
分类: 终端安全

问题: 终端清理仅在正常退出路径执行。terminal.draw()event::read()? 错误传播、或任何 panic,都会跳过 raw mode / alternate screen 恢复

建议修复: 添加 RAII 终端 guard + panic hook 恢复终端状态。

**文件**: `tui/main.rs:33-51` **分类**: 终端安全 **问题**: 终端清理仅在正常退出路径执行。`terminal.draw()` 或 `event::read()` 的 `?` 错误传播、或任何 panic,都会**跳过 raw mode / alternate screen 恢复**。 **建议修复**: 添加 RAII 终端 guard + panic hook 恢复终端状态。
dailz added the area/tuibugseverity/high labels 2026-06-03 13:52:51 +08:00
Author
Owner

审核结论:已修复

该 Issue 描述的问题已不存在于当前代码中

当前代码分析

crates/tui/src/main.rs 已实现完整的 RAII TerminalGuard 模式(第 29-76 行):

  1. Drop trait 已实现(第 66-76 行):在 drop 时执行 disable_raw_mode() + LeaveAlternateScreen + show_cursor()
  2. 错误传播路径已保护terminal.draw()?(第 95 行)和 event::poll/read()?(第 96-97 行)触发 Err 返回时,guard 离开作用域,Drop 自动执行终端恢复
  3. panic 路径已保护:Rust panic unwind 会调用局部变量的 Dropguard 会被正确 drop
  4. enter() 部分失败也有回滚(第 41-58 行):EnterAlternateScreenTerminal::new 失败时,已成功的步骤会被正确回滚

Issue 建议的修复方案(RAII terminal guard)已在代码中实现。关闭此 Issue。

## 审核结论:已修复 ✅ 该 Issue 描述的问题**已不存在于当前代码中**。 ### 当前代码分析 `crates/tui/src/main.rs` 已实现完整的 RAII `TerminalGuard` 模式(第 29-76 行): 1. **`Drop` trait 已实现**(第 66-76 行):在 drop 时执行 `disable_raw_mode()` + `LeaveAlternateScreen` + `show_cursor()` 2. **错误传播路径已保护**:`terminal.draw()` 的 `?`(第 95 行)和 `event::poll/read()` 的 `?`(第 96-97 行)触发 `Err` 返回时,`guard` 离开作用域,`Drop` 自动执行终端恢复 3. **panic 路径已保护**:Rust panic unwind 会调用局部变量的 `Drop`,`guard` 会被正确 drop 4. **enter() 部分失败也有回滚**(第 41-58 行):`EnterAlternateScreen` 或 `Terminal::new` 失败时,已成功的步骤会被正确回滚 Issue 建议的修复方案(RAII terminal guard)已在代码中实现。关闭此 Issue。
dailz closed this issue 2026-06-04 16:37:46 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/logViewer#9