Cygwin: check for STATUS_PENDING in fhandler_base::raw_read

If NtReadFile returns STATUS_PENDING, wait for the read to complete.
This can happen, for instance, in the case of a FIFO opened with
O_RDRW.
This commit is contained in:
Ken Brown 2019-04-14 19:15:59 +00:00 committed by Corinna Vinschen
parent 513f050cbf
commit 10bf30bebf
1 changed files with 13 additions and 1 deletions

View File

@ -215,11 +215,23 @@ fhandler_base::raw_read (void *ptr, size_t& len)
NTSTATUS status; NTSTATUS status;
IO_STATUS_BLOCK io; IO_STATUS_BLOCK io;
int try_noreserve = 1; int try_noreserve = 1;
DWORD waitret = WAIT_OBJECT_0;
retry: retry:
status = NtReadFile (get_handle (), NULL, NULL, NULL, &io, ptr, len, status = NtReadFile (get_handle (), NULL, NULL, NULL, &io, ptr, len,
NULL, NULL); NULL, NULL);
if (NT_SUCCESS (status)) if (status == STATUS_PENDING)
{
waitret = cygwait (get_handle (), cw_infinite,
cw_cancel | cw_sig_eintr);
if (waitret == WAIT_OBJECT_0)
status = io.Status;
}
if (waitret == WAIT_CANCELED)
pthread::static_cancel_self ();
else if (waitret == WAIT_SIGNALED)
set_errno (EINTR);
else if (NT_SUCCESS (status))
len = io.Information; len = io.Information;
else else
{ {