From: grid Date: Wed, 13 Dec 2017 09:20:53 +0000 (+0100) Subject: daemon/tls: tls_push() can fall into endless loop in some circumstances; prevent it X-Git-Tag: v2.0.0~43^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d320ef11450427d3afbd258afe9b0dda69721a91;p=thirdparty%2Fknot-resolver.git daemon/tls: tls_push() can fall into endless loop in some circumstances; prevent it --- 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;