summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2019-11-20 17:52:15 +1300
committerThomas Munro <tmunro@postgresql.org>2019-11-20 18:30:56 +1300
commit2189f49c420f2bf49dfac122f9fbae51c3565594 (patch)
tree173b44acb3ec27c2975e7a302c3d893acbc354e6
parent135026653d450c28d458576a023dffc0e3cb0bf9 (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;
}