Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

diff panics (broken-pipe unwrap) when its stdout is closed early

Fermée
#244 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
3/5
Temps estimé
1-2 jours
Accessibilité débutants
72/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Calme
Stack technique
rust
Domaine
cli

Piste de recherche

Commencez par les écritures de sortie identifiées dans src/diff.rs:94 et src/side_diff.rs:353-356, puis reproduisez les cas normal et côte à côte à l’aide des commandes seq, sed et head fournies. Vérifiez qu’une sortie vers un pipe fermé ne provoque plus de panic et n’affiche plus d’erreur, et que les deux modes se terminent avec le statut SIGPIPE attendu, comme GNU diff.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

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.

Langage dominant
Rust
Étoiles
276
Forks
39
Merge moyen
4 j 12 h
PR mergées (30 j)
3

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de uutils/diffutils

Toutes les issues de uutils/diffutils

Issues similaires

Plus d'issues Rust

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.