From d320ef11450427d3afbd258afe9b0dda69721a91 Mon Sep 17 00:00:00 2001 From: grid Date: Wed, 13 Dec 2017 10:20:53 +0100 Subject: [PATCH] daemon/tls: tls_push() can fall into endless loop in some circumstances; prevent it --- daemon/tls.c | 7 +++++++ daemon/tls.h | 1 + 2 files changed, 8 insertions(+) diff --git a/daemon/tls.c b/daemon/tls.c index 88d7ce430..2f2226e3e 100644 --- a/daemon/tls.c +++ b/daemon/tls.c @@ -231,6 +231,7 @@ int tls_push(struct qr_task *task, uv_handle_t *handle, knot_pkt_t *pkt) } ssize_t submitted = 0; + ssize_t retries = 0; do { count = gnutls_record_uncork(tls_p->session, 0); if (count < 0) { @@ -239,7 +240,13 @@ int tls_push(struct qr_task *task, uv_handle_t *handle, knot_pkt_t *pkt) gnutls_strerror_name(count), count); return kr_error(EIO); } + if (++retries > TLS_MAX_UNCORK_RETRIES) { + kr_log_error("[tls] gnutls_record_uncork: too many sequential non-fatal errors (%zd), last error is: %s (%zd)\n", + retries, gnutls_strerror_name(count), count); + return kr_error(EIO); + } } else { + retries = 0; submitted += count; if (count == 0 && submitted != sizeof(pkt_size) + pkt->size) { kr_log_error("[tls] gnutls_record_uncork didn't send all data: %s (%zd)\n", diff --git a/daemon/tls.h b/daemon/tls.h index 20d1efc52..d13b70ebf 100644 --- a/daemon/tls.h +++ b/daemon/tls.h @@ -24,6 +24,7 @@ #include "lib/generic/map.h" #define MAX_TLS_PADDING KR_EDNS_PAYLOAD +#define TLS_MAX_UNCORK_RETRIES 100 struct tls_ctx_t; struct tls_client_ctx_t; -- 2.47.3