[PATCH] Suppress tr's stderr in the generate function
Allan Odgaard
lists+pass at simplit.com
Mon Dec 28 14:21:35 CET 2020
On 28 Dec 2020, at 11:32, Nicolai Dagestad wrote:
> It might be something fishy with my machine, with:
> python -c "print('0'*4097)" | tr 0 1 | head -c 10
> I get the broken pipe on my laptop, but on none of my other machines
> running arch...
Background:
In the above line `head` reads 10 bytes and then closes its stdin (which
is stdout for `tr`).
When a program writes to a closed pipe (stdout), it will receive SIGPIPE
which by default will terminate the process, so normally `tr` will be
terminated (silently) when nobody reads its output.
The reason for the 4096 bytes is due to buffering, `tr` can succesfully
fill up the buffer before triggering a SIGPIPE signal.
One can set SIGPIPE to be ignored, this will be inherited by a child
process during fork.
If SIGPIPE is being ignored, then it looks very much like `tr` *will*
output an error message, as then `fwrite` will fail and output an error
judging by this code:
https://github.com/coreutils/coreutils/blob/fb64712c4d79a542bae533034c6c4802eae555fd/src/tr.c#L1585-L1587
My theory: Someone has set SIGPIPE to be ignored, for the process that
spawns `pass` (and your test).
Can you give some more information about your execution environment? Is
this a terminal? Maybe try relaunch it and/or reboot.
Or perhaps make a test executable that sets SIGPIPE back to default and
then execute `pass` from that process.
More information about the Password-Store
mailing list