Henri Verbeet : secur32: Properly handle GNUTLS_E_AGAIN in (GnuTLS) schan_imp_recv().

Alexandre Julliard julliard at winehq.org
Mon Oct 3 17:21:24 CDT 2011


Module: wine
Branch: master
Commit: 929598fd00778a6d5e90acd80f68452cd93be0f7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=929598fd00778a6d5e90acd80f68452cd93be0f7

Author: Henri Verbeet <hverbeet at 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);




More information about the wine-cvs mailing list