from is closed normally from the writing end. This is ludicrous; if
that situation isn't a natural EOF, _nothing_ is. So if we get that
particular error, we pretend it's EOF.
git-svn-id: svn://svn.tartarus.org/sgt/putty@7415
cda61777-01e9-0310-a592-
d414129be87e
}
ctx->readret = ReadFile(ctx->h, ctx->buffer, readlen,
&ctx->len, povl);
}
ctx->readret = ReadFile(ctx->h, ctx->buffer, readlen,
&ctx->len, povl);
- if (povl && !ctx->readret && GetLastError() == ERROR_IO_PENDING) {
+ if (!ctx->readret)
+ error = GetLastError();
+ if (povl && !ctx->readret && error == ERROR_IO_PENDING) {
WaitForSingleObject(povl->hEvent, INFINITE);
ctx->readret = GetOverlappedResult(ctx->h, povl, &ctx->len, FALSE);
}
WaitForSingleObject(povl->hEvent, INFINITE);
ctx->readret = GetOverlappedResult(ctx->h, povl, &ctx->len, FALSE);
}
+ if (!ctx->readret) {
+ /*
+ * Windows apparently sends ERROR_BROKEN_PIPE when a
+ * pipe we're reading from is closed normally from the
+ * writing end. This is ludicrous; if that situation
+ * isn't a natural EOF, _nothing_ is. So if we get that
+ * particular error, we pretend it's EOF.
+ */
+ if (error == ERROR_BROKEN_PIPE)
+ ctx->readret = 1;
if (ctx->readret && ctx->len == 0 &&
(ctx->flags & HANDLE_FLAG_IGNOREEOF))
if (ctx->readret && ctx->len == 0 &&
(ctx->flags & HANDLE_FLAG_IGNOREEOF))