mirror of
https://github.com/postgres/postgres.git
synced 2025-08-24 09:27:52 +03:00
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
59 lines
1.1 KiB
C
59 lines
1.1 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* pread.c
|
|
* Implementation of pread(2) for platforms that lack one.
|
|
*
|
|
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
|
*
|
|
* IDENTIFICATION
|
|
* src/port/pread.c
|
|
*
|
|
* Note that this implementation changes the current file position, unlike
|
|
* the POSIX function, so we use the name pg_pread().
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
#include "postgres.h"
|
|
|
|
#ifdef WIN32
|
|
#include <windows.h>
|
|
#else
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
ssize_t
|
|
pg_pread(int fd, void *buf, size_t size, off_t offset)
|
|
{
|
|
#ifdef WIN32
|
|
OVERLAPPED overlapped = {0};
|
|
HANDLE handle;
|
|
DWORD result;
|
|
|
|
handle = (HANDLE) _get_osfhandle(fd);
|
|
if (handle == INVALID_HANDLE_VALUE)
|
|
{
|
|
errno = EBADF;
|
|
return -1;
|
|
}
|
|
|
|
overlapped.Offset = offset;
|
|
if (!ReadFile(handle, buf, size, &result, &overlapped))
|
|
{
|
|
if (GetLastError() == ERROR_HANDLE_EOF)
|
|
return 0;
|
|
|
|
_dosmaperr(GetLastError());
|
|
return -1;
|
|
}
|
|
|
|
return result;
|
|
#else
|
|
if (lseek(fd, offset, SEEK_SET) < 0)
|
|
return -1;
|
|
|
|
return read(fd, buf, size);
|
|
#endif
|
|
}
|