Skip to content

Fix hang in `named-compilezone | head`

Tony Finch requested to merge fanf/bind9:u/fanf2/compilezone-hang into master

I was truncating zone files for experimental purposes when I found that named-compilezone | head got stuck. The full command line that exhibited the problem was:

dig axfr dotat.at |
named-compilezone -o /dev/stdout dotat.at /dev/stdin |
head

This requires a large enough zone to exhibit the problem, more than about 70000 bytes of plain text output from named-compilezone. I was running the command on Debian Stretch amd64.

This was puzzling since it looked like something was suppressing the SIGPIPE. I used strace to examine what was happening at the hang. The program was just calling write() a lot to print the zone file, and the last write() hanged until I sent it a SIGINT.

During some discussion with friends, Ian Jackson guessed that opening /dev/stdout O_RDRW might be the problem, and after some tests we found that this does in fact suppress SIGPIPE.

Since named-compilezone only needs to write to its output file, the fix is to omit the stdio "+" update flag.

Merge request reports