summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2018-04-16 15:14:01 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2018-04-16 15:14:03 +0200
commit8e32440919dbf84c67ea779009ef76b25787d465 (patch)
tree5a8f4124e25cc82de31b95aae26eb691ea52ab8d
parentf3bbeba99258c9e5e90630451c7005192850d718 (diff)
downloadgnutls-8e32440919dbf84c67ea779009ef76b25787d465.tar.gz
handshake: described the epoch reference counting [ci skip]
It is used only in DTLS where multiple handshake states may be active. Resolves #421 Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-rw-r--r--lib/buffers.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/lib/buffers.c b/lib/buffers.c
index 52729f3723..e845247772 100644
--- a/lib/buffers.c
+++ b/lib/buffers.c
@@ -802,6 +802,8 @@ ssize_t _gnutls_handshake_io_write_flush(gnutls_session_t session)
total += ret;
ret = _mbuffer_head_remove_bytes(send_buffer, ret);
+ /* for each queued message we send, ensure that
+ * we drop the epoch refcount set in _gnutls_handshake_io_cache_int(). */
if (ret == 1)
_gnutls_epoch_refcount_dec(session, epoch);
@@ -841,6 +843,8 @@ _gnutls_handshake_io_cache_int(gnutls_session_t session,
send_buffer = &session->internals.handshake_send_buffer;
+ /* ensure that our epoch does not get garbage collected
+ * before we send all queued messages with it */
bufel->epoch =
(uint16_t) _gnutls_epoch_refcount_inc(session,
EPOCH_WRITE_CURRENT);