aboutsummaryrefslogtreecommitdiffstats
path: root/src/libtls/tls_socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libtls/tls_socket.c')
-rw-r--r--src/libtls/tls_socket.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/libtls/tls_socket.c b/src/libtls/tls_socket.c
index 131bada96..db12d1d8b 100644
--- a/src/libtls/tls_socket.c
+++ b/src/libtls/tls_socket.c
@@ -111,7 +111,6 @@ METHOD(tls_application_t, process, status_t,
{
return FAILED;
}
-
memcpy(this->in.ptr + this->in_done, data.ptr, data.len);
this->in_done += data.len;
}
@@ -145,7 +144,7 @@ static bool exchange(private_tls_socket_t *this, bool wr, bool block)
{
char buf[CRYPTO_BUF_SIZE], *pos;
ssize_t len, out;
- int round = 0;
+ int round = 0, flags;
for (round = 0; TRUE; round++)
{
@@ -191,8 +190,16 @@ static bool exchange(private_tls_socket_t *this, bool wr, bool block)
return TRUE;
}
}
- len = recv(this->fd, buf, sizeof(buf),
- !block || this->app.in_done || round ? MSG_DONTWAIT : 0);
+
+ flags = 0;
+ if (this->app.out_done == this->app.out.len)
+ {
+ if (!block || this->app.in_done)
+ {
+ flags |= MSG_DONTWAIT;
+ }
+ }
+ len = recv(this->fd, buf, sizeof(buf), flags);
if (len < 0)
{
if (errno == EAGAIN || errno == EWOULDBLOCK)