From a87ccea03209fed52824cc05fdc892d2358aeea0 Mon Sep 17 00:00:00 2001 From: Tony Finch Date: Tue, 22 Oct 2019 15:37:38 +0100 Subject: [PATCH] Fix hang in `named-compilezone | head` 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. --- bin/check/check-tool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/check/check-tool.c b/bin/check/check-tool.c index e9ab4eb633..9585054456 100644 --- a/bin/check/check-tool.c +++ b/bin/check/check-tool.c @@ -716,7 +716,7 @@ dump_zone(const char *zonename, dns_zone_t *zone, const char *filename, FILE *output = stdout; const char *flags; - flags = (fileformat == dns_masterformat_text) ? "w+" : "wb+"; + flags = (fileformat == dns_masterformat_text) ? "w" : "wb"; if (debug) { if (filename != NULL && strcmp(filename, "-") != 0)