commit e9ef523: [Project] Rdns: Fix TCP connection mess

Vsevolod Stakhov vsevolod at highsecure.ru
Wed Jan 5 11:28:13 UTC 2022


Author: Vsevolod Stakhov
Date: 2022-01-03 00:27:13 +0000
URL: https://github.com/rspamd/rspamd/commit/e9ef523d5ee730c7d93a0bcc97ebfe04c98d3a60

[Project] Rdns: Fix TCP connection mess

---
 contrib/librdns/resolver.c | 38 +++++++++++++-------------------------
 contrib/librdns/util.c     | 10 ++++------
 2 files changed, 17 insertions(+), 31 deletions(-)

diff --git a/contrib/librdns/resolver.c b/contrib/librdns/resolver.c
index 3197230ed..264b46b24 100644
--- a/contrib/librdns/resolver.c
+++ b/contrib/librdns/resolver.c
@@ -295,29 +295,9 @@ rdns_process_tcp_read (int fd, struct rdns_io_channel *ioc)
 static void
 rdns_process_tcp_connect (int fd, struct rdns_io_channel *ioc)
 {
-	struct rdns_resolver *resolver = ioc->resolver;
-	struct rdns_server *serv = ioc->srv;
-	int r = connect (ioc->sock, ioc->saddr, ioc->slen);
-
-	if (r == -1) {
-		if (errno != EAGAIN && errno != EINTR && errno != EINPROGRESS) {
-			rdns_err ("cannot connect a TCP socket: %s for server %s",
-					strerror(errno), serv->name);
-			resolver->async->del_write (resolver->async->data, ioc->async_io);
-		}
-		else {
-			/* We need to wait again for write readiness here */
-			ioc->async_io = resolver->async->add_write (resolver->async->data,
-					ioc->sock, ioc);
-		}
-	}
-	else {
-		/* Always be ready to read from a TCP socket */
-		resolver->async->del_write (resolver->async->data, ioc->async_io);
-		ioc->flags |= RDNS_CHANNEL_CONNECTED|RDNS_CHANNEL_ACTIVE;
-		ioc->tcp->async_read = resolver->async->add_read(resolver->async->data,
-				ioc->sock, ioc);
-	}
+	ioc->flags |= RDNS_CHANNEL_CONNECTED|RDNS_CHANNEL_ACTIVE;
+	ioc->tcp->async_read = ioc->resolver->async->add_read(ioc->resolver->async->data,
+			ioc->sock, ioc);
 }
 
 static void
@@ -373,14 +353,16 @@ void
 rdns_process_read (int fd, void *arg)
 {
 	struct rdns_io_channel *ioc = (struct rdns_io_channel *)arg;
+	struct rdns_resolver *resolver;
 
+	resolver = ioc->resolver;
 
 	if (IS_CHANNEL_TCP(ioc)) {
 		if (IS_CHANNEL_CONNECTED(ioc)) {
 			rdns_process_tcp_read (fd, ioc);
 		}
 		else {
-			rdns_process_tcp_connect (fd, ioc);
+			rdns_err ("read readiness on non connected TCP channel!");
 		}
 	}
 	else {
@@ -628,7 +610,12 @@ rdns_process_udp_retransmit (int fd, struct rdns_request *req)
 static void
 rdns_process_tcp_write (int fd, struct rdns_io_channel *ioc)
 {
-
+	if (ioc->tcp->cur_output_chains == 0) {
+		/* Unregister write event */
+		ioc->resolver->async->del_write (ioc->resolver->async->data,
+				ioc->tcp->async_write);
+		ioc->tcp->async_write = NULL;
+	}
 }
 
 void
@@ -656,6 +643,7 @@ rdns_process_write (int fd, void *arg)
 		}
 		else {
 			rdns_process_tcp_connect(fd, ioc);
+			rdns_process_tcp_write(fd, ioc);
 		}
 	}
 	else {
diff --git a/contrib/librdns/util.c b/contrib/librdns/util.c
index 61c244199..fd71179e9 100644
--- a/contrib/librdns/util.c
+++ b/contrib/librdns/util.c
@@ -548,6 +548,9 @@ rdns_ioc_new (struct rdns_server *serv,
 	}
 
 	nioc->struct_magic = RDNS_IO_CHANNEL_TAG;
+	nioc->srv = serv;
+	nioc->resolver = resolver;
+
 	nioc->sock = rdns_make_client_socket (serv->name, serv->port,
 			is_tcp ? SOCK_STREAM : SOCK_DGRAM, &nioc->saddr, &nioc->slen);
 	if (nioc->sock == -1) {
@@ -570,12 +573,7 @@ rdns_ioc_new (struct rdns_server *serv,
 
 		nioc->flags |= RDNS_CHANNEL_TCP;
 	}
-
-	nioc->srv = serv;
-	nioc->resolver = resolver;
-
-	/* If it is not NULL then we are in a delayed connection state */
-	if (!is_tcp) {
+	else {
 		nioc->flags |= RDNS_CHANNEL_ACTIVE;
 		nioc->async_io = resolver->async->add_read(resolver->async->data,
 				nioc->sock, nioc);


More information about the Commits mailing list