Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Dec 2020 09:38:40 +0000 (UTC)
From:      Bernard Spil <brnrd@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r558269 - in head/dns/unbound: . files
Message-ID:  <202012170938.0BH9cewB088226@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: brnrd
Date: Thu Dec 17 09:38:40 2020
New Revision: 558269
URL: https://svnweb.freebsd.org/changeset/ports/558269

Log:
  dns/unbound: SIGSEGV fix
  
  PR:		251821
  Submitted by:	delphij
  Approved by:	Jaap Akkerhuis (maintainer)
  Obtained from:	https://github.com/NLnetLabs/unbound/issues/376
  MFH:		2020Q4

Added:
  head/dns/unbound/files/patch-Issue376   (contents, props changed)
Modified:
  head/dns/unbound/Makefile

Modified: head/dns/unbound/Makefile
==============================================================================
--- head/dns/unbound/Makefile	Thu Dec 17 09:30:49 2020	(r558268)
+++ head/dns/unbound/Makefile	Thu Dec 17 09:38:40 2020	(r558269)
@@ -3,6 +3,7 @@
 
 PORTNAME=	unbound
 PORTVERSION=	1.13.0
+PORTREVISION=	1
 CATEGORIES=	dns
 MASTER_SITES=	https://www.nlnetlabs.nl/downloads/unbound/ \
 		https://distfiles.crux.guru/

Added: head/dns/unbound/files/patch-Issue376
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/dns/unbound/files/patch-Issue376	Thu Dec 17 09:38:40 2020	(r558269)
@@ -0,0 +1,156 @@
+diff --git a/doc/Changelog b/doc/Changelog
+index 07a8e6ea4..3b831fea1 100644
+--- doc/Changelog.orig
++++ doc/Changelog
+@@ -1,3 +1,7 @@
++16 December 2020: George
++	- Fix error cases when udp-connect is set and send() returns an error
++	  (modified patch from Xin Li @delphij).
++
+ 30 November 2020: Wouter
+ 	- Fix assertion failure on double callback when iterator loses
+ 	  interest in query at head of line that then has the tcp stream
+diff --git a/services/authzone.c b/services/authzone.c
+index 15be5d60c..e59548fc3 100644
+--- services/authzone.c.orig
++++ services/authzone.c
+@@ -6093,7 +6093,7 @@ xfr_probe_send_probe(struct auth_xfer* xfr, struct module_env* env,
+ 
+ 	/* send udp packet */
+ 	if(!comm_point_send_udp_msg(xfr->task_probe->cp, env->scratch_buffer,
+-		(struct sockaddr*)&addr, addrlen)) {
++		(struct sockaddr*)&addr, addrlen, 0)) {
+ 		char zname[255+1], as[256];
+ 		dname_str(xfr->name, zname);
+ 		addr_to_str(&addr, addrlen, as, sizeof(as));
+diff --git a/services/outside_network.c b/services/outside_network.c
+index 0886907f7..d8f9874e6 100644
+--- services/outside_network.c.orig
++++ services/outside_network.c
+@@ -1899,17 +1899,10 @@ randomize_and_send_udp(struct pending* pend, sldns_buffer* packet, int timeout)
+ 	log_assert(pend->pc && pend->pc->cp);
+ 
+ 	/* send it over the commlink */
+-	if(outnet->udp_connect) {
+-		if(!comm_point_send_udp_msg(pend->pc->cp, packet, NULL, 0)) {
+-			portcomm_loweruse(outnet, pend->pc);
+-			return 0;
+-		}
+-	} else {
+-		if(!comm_point_send_udp_msg(pend->pc->cp, packet,
+-			(struct sockaddr*)&pend->addr, pend->addrlen)) {
+-			portcomm_loweruse(outnet, pend->pc);
+-			return 0;
+-		}
++	if(!comm_point_send_udp_msg(pend->pc->cp, packet,
++		(struct sockaddr*)&pend->addr, pend->addrlen, outnet->udp_connect)) {
++		portcomm_loweruse(outnet, pend->pc);
++		return 0;
+ 	}
+ 
+ 	/* system calls to set timeout after sending UDP to make roundtrip
+diff --git a/testcode/fake_event.c b/testcode/fake_event.c
+index 75a6b8db9..5164332c0 100644
+--- testcode/fake_event.c.orig
++++ testcode/fake_event.c
+@@ -1766,7 +1766,7 @@ struct comm_point* outnet_comm_point_for_http(struct outside_network* outnet,
+ }
+ 
+ int comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet,
+-	struct sockaddr* addr, socklen_t addrlen) 
++	struct sockaddr* addr, socklen_t addrlen, int ATTR_UNUSED(is_connected))
+ {
+ 	struct fake_commpoint* fc = (struct fake_commpoint*)c;
+ 	struct replay_runtime* runtime = fc->runtime;
+diff --git a/util/netevent.c b/util/netevent.c
+index 7c6da50be..88be007e7 100644
+--- util/netevent.c.orig
++++ util/netevent.c
+@@ -333,7 +333,7 @@ int tcp_connect_errno_needs_log(struct sockaddr* addr, socklen_t addrlen)
+ /* send a UDP reply */
+ int
+ comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet,
+-	struct sockaddr* addr, socklen_t addrlen) 
++	struct sockaddr* addr, socklen_t addrlen, int is_connected)
+ {
+ 	ssize_t sent;
+ 	log_assert(c->fd != -1);
+@@ -341,8 +341,8 @@ comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet,
+ 	if(sldns_buffer_remaining(packet) == 0)
+ 		log_err("error: send empty UDP packet");
+ #endif
+-	if(addr) {
+-		log_assert(addr && addrlen > 0);
++	log_assert(addr && addrlen > 0);
++	if(!is_connected) {
+ 		sent = sendto(c->fd, (void*)sldns_buffer_begin(packet),
+ 			sldns_buffer_remaining(packet), 0,
+ 			addr, addrlen);
+@@ -367,9 +367,14 @@ comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet,
+ #endif
+ 			int e;
+ 			fd_set_block(c->fd);
+-			sent = sendto(c->fd, (void*)sldns_buffer_begin(packet), 
+-				sldns_buffer_remaining(packet), 0,
+-				addr, addrlen);
++			if (!is_connected) {
++				sent = sendto(c->fd, (void*)sldns_buffer_begin(packet),
++					sldns_buffer_remaining(packet), 0,
++					addr, addrlen);
++			} else {
++				sent = send(c->fd, (void*)sldns_buffer_begin(packet),
++					sldns_buffer_remaining(packet), 0);
++			}
+ 			e = errno;
+ 			fd_set_nonblock(c->fd);
+ 			errno = e;
+@@ -378,8 +383,12 @@ comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet,
+ 	if(sent == -1) {
+ 		if(!udp_send_errno_needs_log(addr, addrlen))
+ 			return 0;
+-		verbose(VERB_OPS, "sendto failed: %s", sock_strerror(errno));
+-		log_addr(VERB_OPS, "remote address is", 
++		if (!is_connected) {
++			verbose(VERB_OPS, "sendto failed: %s", sock_strerror(errno));
++		} else {
++			verbose(VERB_OPS, "send failed: %s", sock_strerror(errno));
++		}
++		log_addr(VERB_OPS, "remote address is",
+ 			(struct sockaddr_storage*)addr, addrlen);
+ 		return 0;
+ 	} else if((size_t)sent != sldns_buffer_remaining(packet)) {
+@@ -764,7 +773,7 @@ comm_point_udp_callback(int fd, short event, void* arg)
+ 			buffer = rep.c->buffer;
+ #endif
+ 			(void)comm_point_send_udp_msg(rep.c, buffer,
+-				(struct sockaddr*)&rep.addr, rep.addrlen);
++				(struct sockaddr*)&rep.addr, rep.addrlen, 0);
+ 		}
+ 		if(!rep.c || rep.c->fd != fd) /* commpoint closed to -1 or reused for
+ 		another UDP port. Note rep.c cannot be reused with TCP fd. */
+@@ -3944,7 +3953,7 @@ comm_point_send_reply(struct comm_reply *repinfo)
+ 			repinfo->addrlen, repinfo);
+ 		else
+ 			comm_point_send_udp_msg(repinfo->c, buffer,
+-			(struct sockaddr*)&repinfo->addr, repinfo->addrlen);
++			(struct sockaddr*)&repinfo->addr, repinfo->addrlen, 0);
+ #ifdef USE_DNSTAP
+ 		if(repinfo->c->dtenv != NULL &&
+ 		   repinfo->c->dtenv->log_client_response_messages)
+diff --git a/util/netevent.h b/util/netevent.h
+index 266a74ff3..810190683 100644
+--- util/netevent.h.orig
++++ util/netevent.h
+@@ -633,10 +633,11 @@ void comm_point_drop_reply(struct comm_reply* repinfo);
+  * @param addr: where to send it to.   If NULL, send is performed,
+  * 	for connected sockets, to the connected address.
+  * @param addrlen: length of addr.
++ * @param is_connected: if the UDP socket is connect()ed.
+  * @return: false on a failure.
+  */
+ int comm_point_send_udp_msg(struct comm_point* c, struct sldns_buffer* packet,
+-	struct sockaddr* addr, socklen_t addrlen);
++	struct sockaddr* addr, socklen_t addrlen,int is_connected);
+ 
+ /**
+  * Stop listening for input on the commpoint. No callbacks will happen.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202012170938.0BH9cewB088226>