From fe4d0fbc7c88acf4f2d1a4f6d612f123b56fbd98 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 5 Oct 2016 12:20:02 +1100 Subject: [PATCH] 4473. [bug] Only call fsync / _commit on regular files. [RT #43196] --- CHANGES | 2 ++ lib/isc/unix/stdio.c | 14 ++++++++++---- lib/isc/win32/stdio.c | 13 +++++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 0f085a5570..8a7bf7eb59 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +4473. [bug] Only call fsync / _commit on regular files. [RT #43196] + 4472. [bug] Named could fail to find the correct NSEC3 records when a zone was updated between looking for the answer and looking for the NSEC3 records proving non-existance diff --git a/lib/isc/unix/stdio.c b/lib/isc/unix/stdio.c index 03d0e7c316..d10d1121ca 100644 --- a/lib/isc/unix/stdio.c +++ b/lib/isc/unix/stdio.c @@ -128,14 +128,20 @@ isc_stdio_flush(FILE *f) { isc_result_t isc_stdio_sync(FILE *f) { + struct stat buf; int r; - r = fsync(fileno(f)); + if (fstat(fileno(f), &buf) != 0) + return (isc__errno2result(errno)); + /* - * fsync is not supported on sockets and pipes which - * result in EINVAL / ENOTSUP. + * Only call fsync() on regular files. */ - if (r == 0 || errno == EINVAL || errno == ENOTSUP) + if ((buf.st_mode & S_IFMT) != S_IFREG) + return (ISC_R_SUCCESS); + + r = fsync(fileno(f)); + if (r == 0) return (ISC_R_SUCCESS); else return (isc__errno2result(errno)); diff --git a/lib/isc/win32/stdio.c b/lib/isc/win32/stdio.c index 6735d2ba6f..a03a37ae48 100644 --- a/lib/isc/win32/stdio.c +++ b/lib/isc/win32/stdio.c @@ -16,6 +16,9 @@ #include #include +#include +#include + #include "errno2result.h" isc_result_t @@ -124,8 +127,18 @@ isc_stdio_flush(FILE *f) { isc_result_t isc_stdio_sync(FILE *f) { + struct _stat buf; int r; + if (_fstat(_fileno(f), &buf) != 0) + return (isc__errno2result(errno)); + + /* + * Only call _commit() on regular files. + */ + if ((buf.st_mode & S_IFMT) != S_IFREG) + return (ISC_R_SUCCESS); + r = _commit(_fileno(f)); if (r == 0) return (ISC_R_SUCCESS);