Module: wine Branch: master Commit: 929598fd00778a6d5e90acd80f68452cd93be0f7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=929598fd00778a6d5e90acd80f...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Mon Oct 3 20:22:51 2011 +0200
secur32: Properly handle GNUTLS_E_AGAIN in (GnuTLS) schan_imp_recv().
---
dlls/secur32/schannel_gnutls.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-)
diff --git a/dlls/secur32/schannel_gnutls.c b/dlls/secur32/schannel_gnutls.c index e47c022..96fb471 100644 --- a/dlls/secur32/schannel_gnutls.c +++ b/dlls/secur32/schannel_gnutls.c @@ -371,11 +371,23 @@ SECURITY_STATUS schan_imp_recv(schan_imp_session session, void *buffer, SIZE_T *length) { gnutls_session_t s = (gnutls_session_t)session; - ssize_t ret = pgnutls_record_recv(s, buffer, *length); + ssize_t ret; + +again: + ret = pgnutls_record_recv(s, buffer, *length); + if (ret >= 0) *length = ret; else if (ret == GNUTLS_E_AGAIN) + { + struct schan_transport *t = (struct schan_transport *)pgnutls_transport_get_ptr(s); + SIZE_T count = 0; + + if (schan_get_buffer(t, &t->in, &count)) + goto again; + return SEC_I_CONTINUE_NEEDED; + } else { pgnutls_perror(ret);