summaryrefslogtreecommitdiff
path: root/src/streams
diff options
context:
space:
mode:
authorEtienne Samson <samson.etienne@gmail.com>2018-03-29 22:14:04 +0200
committerEtienne Samson <samson.etienne@gmail.com>2018-04-11 21:02:43 +0200
commitec79b0fdd6236647349a67010f1a8fdcc5edfae7 (patch)
tree947ac8efd07f9d68ce03b32e86bfcee12ee8fa05 /src/streams
parent2419cccd16ae6585e2b58360dc6a53304a3baee8 (diff)
downloadlibgit2-ec79b0fdd6236647349a67010f1a8fdcc5edfae7.tar.gz
mbedtls: fix libgit2 hanging due to incomplete writes
Diffstat (limited to 'src/streams')
-rw-r--r--src/streams/mbedtls.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/streams/mbedtls.c b/src/streams/mbedtls.c
index 42ac8aa17..fa7d31e71 100644
--- a/src/streams/mbedtls.c
+++ b/src/streams/mbedtls.c
@@ -345,16 +345,20 @@ static int mbedtls_set_proxy(git_stream *stream, const git_proxy_options *proxy_
ssize_t mbedtls_stream_write(git_stream *stream, const char *data, size_t len, int flags)
{
+ size_t read = 0;
mbedtls_stream *st = (mbedtls_stream *) stream;
- int ret;
GIT_UNUSED(flags);
- if ((ret = mbedtls_ssl_write(st->ssl, (const unsigned char *)data, len)) <= 0) {
- return ssl_set_error(st->ssl, ret);
- }
+ do {
+ int error = mbedtls_ssl_write(st->ssl, (const unsigned char *)data + read, len - read);
+ if (error <= 0) {
+ return ssl_set_error(st->ssl, error);
+ }
+ read += error;
+ } while (read < len);
- return ret;
+ return read;
}
ssize_t mbedtls_stream_read(git_stream *stream, void *data, size_t len)