}
ssize_t submitted = 0;
+ ssize_t retries = 0;
do {
count = gnutls_record_uncork(tls_p->session, 0);
if (count < 0) {
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",
#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;