From b6e9732ae5e7448c368b4331fa0ff85e0c7a0e56 Mon Sep 17 00:00:00 2001 From: Michael Ortmann Date: Fri, 31 Oct 2025 11:37:10 +0100 Subject: [PATCH 1/3] Fix writing to tls socket --- src/tls.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/tls.c b/src/tls.c index 76c9929dd..760f49cde 100644 --- a/src/tls.c +++ b/src/tls.c @@ -896,14 +896,15 @@ static void ssl_info(const SSL *ssl, int where, int ret) SSL_state_string_long(ssl)); } else if (ret < 0) { int err = SSL_get_error(ssl, ret); - /* However we still check <0 as man example does so too */ - if (err & (SSL_ERROR_WANT_READ | SSL_ERROR_WANT_WRITE)) { - /* Errors to be ignored for non-blocking */ - debug1("TLS: awaiting more %s", (err & SSL_ERROR_WANT_READ) ? "reads" : "writes"); - } else { + /* However we still check <0 as man example does so too + * Errors to be ignored for non-blocking + * debug print, like "TLS: awaiting more", must not be used for + * SSL_ERROR_WANT_READ | SSL_ERROR_WANT_WRITE because tputs() is not + * reentrant + */ + if (!(err & (SSL_ERROR_WANT_READ | SSL_ERROR_WANT_WRITE))) putlog(data->loglevel, "*", "TLS: error in: %s.", SSL_state_string_long(ssl)); - } } } /* Display the state of the engine for debugging purposes */ From a8923effa7cd23ab4b575363bec60685ef43c865 Mon Sep 17 00:00:00 2001 From: Michael Ortmann Date: Tue, 25 Nov 2025 20:49:02 +0100 Subject: [PATCH 2/3] Proper fix --- src/dcc.c | 28 +++++++++++++++------------- src/tls.c | 13 ++++++------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/dcc.c b/src/dcc.c index 0bd0a95cf..46e6ec3d1 100644 --- a/src/dcc.c +++ b/src/dcc.c @@ -90,19 +90,17 @@ static int detect_telnet(unsigned char *buf) } /* Escape telnet IAC and prepend CR to LF */ -static char *escape_telnet(char *s) +static char *escape_telnet(char *restrict dst, const char *restrict src, size_t dstsize) { - static char buf[1024]; char *p; - for (p = buf; *s && (p < (buf + sizeof(buf) - 2)); *p++ = *s++) - if ((unsigned char) *s == TLN_IAC) - *p++ = *s; - else if (*s == '\n') + for (p = dst; *src && (p < (dst + dstsize - 2)); *p++ = *src++) + if ((unsigned char) *src == TLN_IAC) + *p++ = *src; + else if (*src == '\n') *p++ = '\r'; *p = 0; - - return buf; + return dst; } static void strip_telnet(int sock, char *buf, int *len) @@ -965,11 +963,14 @@ static void append_line(int idx, char *line) static void out_dcc_general(int idx, char *buf, void *x) { struct chat_info *p = (struct chat_info *) x; - char *y = buf; + char dst[1024]; + char *y; strip_mirc_codes(p->strip_flags, buf); - if (dcc[idx].status & STAT_TELNET) - y = escape_telnet(buf); + if (dcc[idx].status & STAT_TELNET) { + y = escape_telnet(dst, buf, sizeof dst); + } else + y = buf; if (dcc[idx].status & STAT_PAGE) append_line(idx, y); else @@ -1826,8 +1827,9 @@ static void dcc_telnet_pass(int idx, int atr) /* Turn off remote telnet echo (send IAC WILL ECHO). */ if (dcc[idx].status & STAT_TELNET) { - char buf[512]; - snprintf(buf, sizeof buf, "\n%s%s\r\n", escape_telnet(DCC_ENTERPASS), + char dst[512], buf[512]; + snprintf(buf, sizeof buf, "\n%s%s\r\n", + escape_telnet(dst, DCC_ENTERPASS, sizeof dst), TLN_IAC_C TLN_WILL_C TLN_ECHO_C); tputs(dcc[idx].sock, buf, strlen(buf)); } else diff --git a/src/tls.c b/src/tls.c index 760f49cde..76c9929dd 100644 --- a/src/tls.c +++ b/src/tls.c @@ -896,15 +896,14 @@ static void ssl_info(const SSL *ssl, int where, int ret) SSL_state_string_long(ssl)); } else if (ret < 0) { int err = SSL_get_error(ssl, ret); - /* However we still check <0 as man example does so too - * Errors to be ignored for non-blocking - * debug print, like "TLS: awaiting more", must not be used for - * SSL_ERROR_WANT_READ | SSL_ERROR_WANT_WRITE because tputs() is not - * reentrant - */ - if (!(err & (SSL_ERROR_WANT_READ | SSL_ERROR_WANT_WRITE))) + /* However we still check <0 as man example does so too */ + if (err & (SSL_ERROR_WANT_READ | SSL_ERROR_WANT_WRITE)) { + /* Errors to be ignored for non-blocking */ + debug1("TLS: awaiting more %s", (err & SSL_ERROR_WANT_READ) ? "reads" : "writes"); + } else { putlog(data->loglevel, "*", "TLS: error in: %s.", SSL_state_string_long(ssl)); + } } } /* Display the state of the engine for debugging purposes */ From 01e756098b40d2747ea22f0f830bd8b2dfee9e50 Mon Sep 17 00:00:00 2001 From: Michael Ortmann Date: Mon, 19 Jan 2026 05:23:45 +0100 Subject: [PATCH 3/3] Fix buffer size --- src/dcc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dcc.c b/src/dcc.c index f76f62675..d355157fb 100644 --- a/src/dcc.c +++ b/src/dcc.c @@ -1846,7 +1846,7 @@ static void dcc_telnet_pass(int idx, int atr) /* Turn off remote telnet echo (send IAC WILL ECHO). */ if (dcc[idx].status & (STAT_TELNET | STAT_WS)) { - char dst[512], buf[512]; + char dst[506], buf[512]; snprintf(buf, sizeof buf, "\n%s%s\r\n", escape_telnet(dst, DCC_ENTERPASS, sizeof dst), TLN_IAC_C TLN_WILL_C TLN_ECHO_C);