diff options
Diffstat (limited to 'lib/buffers.c')
-rw-r--r-- | lib/buffers.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/lib/buffers.c b/lib/buffers.c index 2d0e3d8afc..3a058a2b18 100644 --- a/lib/buffers.c +++ b/lib/buffers.c @@ -792,9 +792,26 @@ ssize_t _gnutls_handshake_io_write_flush(gnutls_session_t session) { epoch = cur->epoch; - ret = _gnutls_send_int(session, cur->type, - cur->htype, - epoch, msg.data, msg.size, 0); + if (session->internals.read_func) { + record_parameters_st *params; + + ret = _gnutls_epoch_get(session, epoch, ¶ms); + if (ret < 0) + return gnutls_assert_val(ret); + ret = session->internals.read_func(session, + cur->htype, + params->write.level, + msg.data, + msg.size); + if (ret < 0) + return gnutls_assert_val(ret); + + ret = msg.size; + } else { + ret = _gnutls_send_int(session, cur->type, + cur->htype, + epoch, msg.data, msg.size, 0); + } if (ret >= 0) { total += ret; @@ -1429,6 +1446,10 @@ _gnutls_handshake_io_recv_int(gnutls_session_t session, return gnutls_assert_val(ret); } + /* If handshake is handled manually, don't receive records from I/O */ + if (session->internals.read_func) + return GNUTLS_E_AGAIN; + if (htype != (gnutls_handshake_description_t) -1) { ret = handshake_remaining_time(session); if (ret < 0) |