diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2018-07-20 08:20:48 -0700 |
---|---|---|
committer | Patrick Steinhardt <ps@pks.im> | 2018-10-26 14:58:52 +0200 |
commit | 80890b9a354a67aacad66949ba745f5a0073879f (patch) | |
tree | 0a320e614e0f9fb8af610a39cb8b29b621b6a0bc | |
parent | ebdca44a407284305fb701221470ed48145ef586 (diff) | |
download | libgit2-80890b9a354a67aacad66949ba745f5a0073879f.tar.gz |
winhttp: retry erroneously failing requests
Early Windows TLS 1.2 implementations have an issue during key exchange
with OpenSSL implementations that cause negotiation to fail with the
error "the buffer supplied to a function was too small."
This is a transient error on the connection, so when that error is
received, retry up to 5 times to create a connection to the remote
server before actually giving up.
(cherry picked from commit dc371e3c5903760cc2334a0acfac9bce04479773)
-rw-r--r-- | src/transports/winhttp.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/src/transports/winhttp.c b/src/transports/winhttp.c index 4a1eb0490..c3c18a80a 100644 --- a/src/transports/winhttp.c +++ b/src/transports/winhttp.c @@ -846,23 +846,27 @@ on_error: static int do_send_request(winhttp_stream *s, size_t len, int ignore_length) { - if (ignore_length) { - if (!WinHttpSendRequest(s->request, - WINHTTP_NO_ADDITIONAL_HEADERS, 0, - WINHTTP_NO_REQUEST_DATA, 0, - WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH, 0)) { - return -1; - } - } else { - if (!WinHttpSendRequest(s->request, - WINHTTP_NO_ADDITIONAL_HEADERS, 0, - WINHTTP_NO_REQUEST_DATA, 0, - len, 0)) { - return -1; + int attempts; + bool success; + + for (attempts = 0; attempts < 5; attempts++) { + if (ignore_length) { + success = WinHttpSendRequest(s->request, + WINHTTP_NO_ADDITIONAL_HEADERS, 0, + WINHTTP_NO_REQUEST_DATA, 0, + WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH, 0); + } else { + success = WinHttpSendRequest(s->request, + WINHTTP_NO_ADDITIONAL_HEADERS, 0, + WINHTTP_NO_REQUEST_DATA, 0, + len, 0); } + + if (success || GetLastError() != SEC_E_BUFFER_TOO_SMALL) + break; } - return 0; + return success ? 0 : -1; } static int send_request(winhttp_stream *s, size_t len, int ignore_length) |