[PATCH] Suppress tr's stderr in the generate function

Kjetil Torgrim Homme kjetil.homme at redpill-linpro.com
Mon Dec 28 17:11:52 CET 2020

On 28/12/2020 14:21, Allan Odgaard wrote:
> 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).

A small anecdote about this problem from 15 years ago:  I had a problem 
with the makewhatis cron job starting to emit mail to root about broken 
pipes (thousands of lines).  When I ran the job by hand, it all worked 
fine.  After a reboot, it also worked fine.

After quite a while of headscratching, the cause was found: When RPM 
(actually up2date) ran, it ignored the SIGPIPE signal (in order to close 
the rpmdb cleanly on write error).  If the cron package was updated, the 
cron daemon was restarted, with SIGPIPE still ignored.  Cron did not 
touch signal handlers during startup, so the result was that all cron 
jobs launched thereafter would get this very confusing behaviour.

These days systemd makes sure services are starting in a clean and 
consistent state, so this is less likely to crop up again :-)

Kjetil T. Homme
Redpill Linpro - Changing the Game

More information about the Password-Store mailing list