summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro2019-11-20 04:52:15 +0000
committerThomas Munro2019-11-20 05:29:37 +0000
commit6969deeb8d3991cc533a5bcf451ae5eecaa9a517 (patch)
tree11c5e673f5c27edb19c08fd2fbf725cda73b956d
parent80e05a088e4edd421c9c0374d54d787c8a4c0d86 (diff)
Handle ReadFile() EOF correctly on Windows.
When ReadFile() encounters the end of a file while reading from a synchronous handle with an offset provided via OVERLAPPED, it reports an error instead of returning 0. By not handling that (undocumented) result correctly, we caused some noisy LOG messages about an unknown error code. Repair. Back-patch to 12, where we started using pread()/ReadFile() with an offset. Reported-by: ZhenHua Cai, Amit Kapila Diagnosed-by: Juan Jose Santamaria Flecha Tested-by: Amit Kapila Discussion: https://postgr.es/m/CAA4eK1LK3%2BWRtpz68TiRdpHwxxWm%3D%2Bt1BMf-G68hhQsAQ41PZg%40mail.gmail.com
-rw-r--r--src/port/pread.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/port/pread.c b/src/port/pread.c
index a84859e8126..464cd2e8655 100644
--- a/src/port/pread.c
+++ b/src/port/pread.c
@@ -41,6 +41,9 @@ pg_pread(int fd, void *buf, size_t size, off_t offset)
overlapped.Offset = offset;
if (!ReadFile(handle, buf, size, &result, &overlapped))
{
+ if (GetLastError() == ERROR_HANDLE_EOF)
+ return 0;
+
_dosmaperr(GetLastError());
return -1;
}