diff panics (broken-pipe unwrap) when its stdout is closed early
維護者通常 1 天內回覆
還沒有人認領這個 Issue。
評估
研究方向
從 src/diff.rs:94 和 src/side_diff.rs:353-356 中找出的輸出寫入開始,接著使用提供的 seq、sed 和 head 命令重現一般和並排的情況。確認輸出至已關閉的管線不再觸發 panic 或印出錯誤,且兩種模式都如 GNU diff 一樣以預期的 SIGPIPE 狀態結束。
由索引模型根據 Issue 內容生成。
描述
Summary
When diff's standard output is a pipe whose reader closes early (e.g. diff … | head), uutils diff aborts with a panic (exit 134, core dump)
instead of dying cleanly to SIGPIPE like GNU (exit 141). The output is written with a bare .unwrap() on the write_all/push_output result; the BrokenPipe error is unwrapped and, under panic="abort", aborts the process. This affects every output mode: the normal/context/unified/ed path writes the buffered result in src/diff.rs:94, and the side-by-side (-y) path writes each line in src/side_diff.rs:353-356.
Steps to reproduce
$ seq 1 100000 > b1; seq 1 100000 | sed 's/5/X/' > b2
$ diffutils diff b1 b2 | head -1
thread 'main' panicked at src/diff.rs:94:41:
called `Result::unwrap()` on an `Err` value: Os { code: 32, kind: BrokenPipe, message: "Broken pipe" }
$ echo "${PIPESTATUS[0]}"
134
Side-by-side mode hits the sibling site src/side_diff.rs:353:
$ diffutils diff -y b1 b2 | head -1
thread 'main' panicked at src/side_diff.rs:353:87:
called `Result::unwrap()` on an `Err` value: Os { code: 32, kind: BrokenPipe, message: "Broken pipe" }
$ echo "${PIPESTATUS[0]}"
134
Expected behavior
Match GNU: a closed output pipe terminates the program via SIGPIPE (exit 141) with no error message and no core dump.
$ /usr/bin/diff b1 b2 | head -1
1c1
$ echo "${PIPESTATUS[0]}"
141
$ /usr/bin/diff -y b1 b2 | head -1
1 < 1
$ echo "${PIPESTATUS[0]}"
141
Root cause
The full diff output (normal/context/unified/ed) is buffered and written once:
// src/diff.rs:94
io::stdout().write_all(&result).unwrap();
Side-by-side writes each line straight to the locked stdout and unwraps every
write:
// src/side_diff.rs:353-356
push_output(...).unwrap(); // and the sibling unwraps at :354, :356
Any write_all/push_output error — BrokenPipe in the common pipe-closed case — is unwrapped and aborts.
Found by our static analysis tooling.
- 主要語言
- Rust
- 星號
- 276
- 分支
- 44
- 平均合併
- 1 天 23 小時
- 30 天內合併 PR
- 8
環境準備
- 沒有 Dockerfile 或 Docker Compose 檔案
- 沒有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
uutils/diffutils 的其他 Issue
-
cmp: quiet mode compares full file sizes before applying -n可能已有人在做 @SichenLiang 於 10 天前認領。 未關閉
難度 2/5 1-3 小時 新手友好度 78/100
維護者通常 1 天內回覆
-
diff: `-y --tabsize=<huge>` overflows the column arithmetic (overflow-checks only)可能已有人在做 @sami-daniel 於 61 天前認領。 未關閉
難度 2/5 1-3 小時 新手友好度 70/100
維護者通常 1 天內回覆
-
diff panics on an oversized inline context count (`-c`/`-u`/`-C`/`-U`): parse overflow and capacity overflow可能已有人在做 @MsfPablo 於 56 天前認領。 未關閉
難度 2/5 1-3 小時 新手友好度 72/100
uutils/diffutils#245 · 1 則留言 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 68/100
維護者通常 1 天內回覆
-
sdiff: fix the layout of unchanged rows, blank lines and cut tabs可能已有人在做 @sami-daniel 於 7 天前認領。 未關閉
難度 2/5 1-3 小時 新手友好度 28/100
維護者通常 1 天內回覆
相似的 Issue
-
難度 1/5 1 小時以內 新手友好度 75/100
RustCrypto/SSH#596 ·
-
proxy: SQL-over-HTTP turns empty arrays into [""] or [false], or HTTP 500 for int and float arrays未關閉
難度 2/5 1-3 小時 新手友好度 83/100
neondatabase/neon#12965 ·
-
難度 2/5 1-3 小時 新手友好度 78/100
goauthentik/authentik#26867 ·
維護者通常 1 天內回覆
-
Table and code-block right borders are clipped when the TOC panel is resized wider than the default未關閉
難度 2/5 1-3 小時 新手友好度 83/100
維護者通常 1 天內回覆
-
api bug macos maintainer-needed p2 triaged
難度 2/5 1-3 小時 新手友好度 66/100
維護者通常 1 天內回覆