Commit 97b61252 authored by Dridi Boukelmoune's avatar Dridi Boukelmoune

v1l: Preserve a copy of errno after writev(2)

This is to ensure we don't lose write errors by the time we make the
final checks.
parent c60c2886
...@@ -174,6 +174,7 @@ stream_close_t ...@@ -174,6 +174,7 @@ stream_close_t
V1L_Flush(const struct worker *wrk) V1L_Flush(const struct worker *wrk)
{ {
ssize_t i; ssize_t i;
int err;
struct v1l *v1l; struct v1l *v1l;
char cbuf[32]; char cbuf[32];
...@@ -228,7 +229,9 @@ V1L_Flush(const struct worker *wrk) ...@@ -228,7 +229,9 @@ V1L_Flush(const struct worker *wrk)
* prevent slowloris attacks * prevent slowloris attacks
*/ */
if (errno == EWOULDBLOCK) { err = errno;
if (err == EWOULDBLOCK) {
VSLb(v1l->vsl, SLT_Debug, VSLb(v1l->vsl, SLT_Debug,
"Hit idle send timeout, " "Hit idle send timeout, "
"wrote = %zd/%zd; retrying", "wrote = %zd/%zd; retrying",
...@@ -237,14 +240,14 @@ V1L_Flush(const struct worker *wrk) ...@@ -237,14 +240,14 @@ V1L_Flush(const struct worker *wrk)
if (i > 0) if (i > 0)
v1l_prune(v1l, i); v1l_prune(v1l, i);
} while (i > 0 || errno == EWOULDBLOCK); } while (i > 0 || err == EWOULDBLOCK);
if (i <= 0) { if (i <= 0) {
VSLb(v1l->vsl, SLT_Debug, VSLb(v1l->vsl, SLT_Debug,
"Write error, retval = %zd, len = %zd, errno = %s", "Write error, retval = %zd, len = %zd, errno = %s",
i, v1l->liov, VAS_errtxt(errno)); i, v1l->liov, VAS_errtxt(err));
assert(v1l->werr == SC_NULL); assert(v1l->werr == SC_NULL);
if (errno == EPIPE) if (err == EPIPE)
v1l->werr = SC_REM_CLOSE; v1l->werr = SC_REM_CLOSE;
else else
v1l->werr = SC_TX_ERROR; v1l->werr = SC_TX_ERROR;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment