You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.6 KiB
57 lines
1.6 KiB
commit a4fa582908b9c63957240cb0cb68b59d56244ef5 |
|
Author: Bodo Stroesser <bstroesser@ts.fujitsu.com> |
|
Date: Thu Nov 6 13:26:00 2014 -0500 |
|
|
|
write_vc: fix write retry loop for nonblocking mode |
|
|
|
This is a simple fix for the write retry loop that is used on |
|
non-blocking connections if write() failed with -EAGAIN. |
|
|
|
Additionally it removes a redundant if () {} |
|
|
|
Erroneously at each cycle of the loop the length of the data |
|
to send is incremented and the buffer pointer is decremented. |
|
Thus, it might happen that: |
|
* the application crashes |
|
* data from the memory before the buffer is sent |
|
|
|
Signed-off-by: Bodo Stroesser <bstroesser@ts.fujitsu.com> |
|
Signed-off-by: Steve Dickson <steved@redhat.com> |
|
|
|
diff --git a/src/svc_vc.c b/src/svc_vc.c |
|
index 4c70de8..4d3ea51 100644 |
|
--- a/src/svc_vc.c |
|
+++ b/src/svc_vc.c |
|
@@ -559,20 +559,19 @@ write_vc(xprtp, buf, len) |
|
cd->strm_stat = XPRT_DIED; |
|
return (-1); |
|
} |
|
- if (cd->nonblock && i != cnt) { |
|
- /* |
|
- * For non-blocking connections, do not |
|
- * take more than 2 seconds writing the |
|
- * data out. |
|
- * |
|
- * XXX 2 is an arbitrary amount. |
|
- */ |
|
- gettimeofday(&tv1, NULL); |
|
- if (tv1.tv_sec - tv0.tv_sec >= 2) { |
|
- cd->strm_stat = XPRT_DIED; |
|
- return (-1); |
|
- } |
|
+ /* |
|
+ * For non-blocking connections, do not |
|
+ * take more than 2 seconds writing the |
|
+ * data out. |
|
+ * |
|
+ * XXX 2 is an arbitrary amount. |
|
+ */ |
|
+ gettimeofday(&tv1, NULL); |
|
+ if (tv1.tv_sec - tv0.tv_sec >= 2) { |
|
+ cd->strm_stat = XPRT_DIED; |
|
+ return (-1); |
|
} |
|
+ i = 0; /* Don't change buf and cnt */ |
|
} |
|
} |
|
|
|
|