Use upstream version of patch for previously fixed #794940
Signed-off-by: Tomas Hozza <thozza@redhat.com>
This commit is contained in:
		
							parent
							
								
									3ddaff2ea9
								
							
						
					
					
						commit
						48fc9b39c5
					
				| @ -26,7 +26,7 @@ Summary:  The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) serv | |||||||
| Name:     bind | Name:     bind | ||||||
| License:  ISC | License:  ISC | ||||||
| Version:  9.9.4 | Version:  9.9.4 | ||||||
| Release:  3%{?PATCHVER}%{?PREVER}%{?dist} | Release:  4%{?PATCHVER}%{?PREVER}%{?dist} | ||||||
| Epoch:    32 | Epoch:    32 | ||||||
| Url:      http://www.isc.org/products/BIND/ | Url:      http://www.isc.org/products/BIND/ | ||||||
| Buildroot:%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) | Buildroot:%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) | ||||||
| @ -82,8 +82,8 @@ Patch137:bind99-rrl.patch | |||||||
| # Install dns/update.h header for bind-dyndb-ldap plugin | # Install dns/update.h header for bind-dyndb-ldap plugin | ||||||
| Patch138:bind-9.9.3-include-update-h.patch | Patch138:bind-9.9.3-include-update-h.patch | ||||||
| Patch139:bind99-ISC-Bugs-34738.patch | Patch139:bind99-ISC-Bugs-34738.patch | ||||||
| # reported upstream -> [ISC-Bugs #34870] | # upstream patch [ISC-Bugs #34870] | ||||||
| Patch140:bind99-ISC-Bugs-34870.patch | Patch140:bind99-ISC-Bugs-34870-v2.patch | ||||||
| 
 | 
 | ||||||
| # SDB patches | # SDB patches | ||||||
| Patch11: bind-9.3.2b2-sdbsrc.patch | Patch11: bind-9.3.2b2-sdbsrc.patch | ||||||
| @ -787,6 +787,9 @@ rm -rf ${RPM_BUILD_ROOT} | |||||||
| %endif | %endif | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Tue Oct 29 2013 Tomas Hozza <thozza@redhat.com> 32:9.9.4-4 | ||||||
|  | - Use upstream version of patch for previously fixed #794940 | ||||||
|  | 
 | ||||||
| * Fri Oct 18 2013 Tomas Hozza <thozza@redhat.com> 32:9.9.4-3 | * Fri Oct 18 2013 Tomas Hozza <thozza@redhat.com> 32:9.9.4-3 | ||||||
| - Fix race condition on send buffers in dighost.c (#794940) | - Fix race condition on send buffers in dighost.c (#794940) | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										217
									
								
								bind99-ISC-Bugs-34870-v2.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								bind99-ISC-Bugs-34870-v2.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,217 @@ | |||||||
|  | diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c
 | ||||||
|  | index 2b7b970..491192d 100644
 | ||||||
|  | --- a/bin/dig/dighost.c
 | ||||||
|  | +++ b/bin/dig/dighost.c
 | ||||||
|  | @@ -180,6 +180,7 @@ isc_boolean_t validated = ISC_TRUE;
 | ||||||
|  |  isc_entropy_t *entp = NULL; | ||||||
|  |  isc_mempool_t *commctx = NULL; | ||||||
|  |  isc_boolean_t debugging = ISC_FALSE; | ||||||
|  | +isc_boolean_t debugtiming = ISC_FALSE;
 | ||||||
|  |  isc_boolean_t memdebugging = ISC_FALSE; | ||||||
|  |  char *progname = NULL; | ||||||
|  |  isc_mutex_t lookup_lock; | ||||||
|  | @@ -539,6 +540,12 @@ debug(const char *format, ...) {
 | ||||||
|  |   | ||||||
|  |  	if (debugging) { | ||||||
|  |  		fflush(stdout); | ||||||
|  | +		if (debugtiming) {
 | ||||||
|  | +			struct timeval tv;
 | ||||||
|  | +			(void)gettimeofday(&tv, NULL);
 | ||||||
|  | +			fprintf(stderr, "%ld.%06ld: ", (long)tv.tv_sec,
 | ||||||
|  | +				(long)tv.tv_usec);
 | ||||||
|  | +		}
 | ||||||
|  |  		va_start(args, format); | ||||||
|  |  		vfprintf(stderr, format, args); | ||||||
|  |  		va_end(args); | ||||||
|  | @@ -2365,8 +2372,10 @@ send_done(isc_task_t *_task, isc_event_t *event) {
 | ||||||
|  |   | ||||||
|  |  	for  (b = ISC_LIST_HEAD(sevent->bufferlist); | ||||||
|  |  	      b != NULL; | ||||||
|  | -	      b = ISC_LIST_HEAD(sevent->bufferlist))
 | ||||||
|  | +	      b = ISC_LIST_HEAD(sevent->bufferlist)) {
 | ||||||
|  |  		ISC_LIST_DEQUEUE(sevent->bufferlist, b, link); | ||||||
|  | +		isc_mem_free(mctx, b);
 | ||||||
|  | +	}
 | ||||||
|  |   | ||||||
|  |  	query = event->ev_arg; | ||||||
|  |  	query->waiting_senddone = ISC_FALSE; | ||||||
|  | @@ -2558,6 +2567,17 @@ send_tcp_connect(dig_query_t *query) {
 | ||||||
|  |  	} | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static isc_buffer_t *
 | ||||||
|  | +clone_buffer(isc_buffer_t *source) {
 | ||||||
|  | +	isc_buffer_t *buffer;
 | ||||||
|  | +	buffer = isc_mem_allocate(mctx, sizeof(*buffer));
 | ||||||
|  | +	if (buffer == NULL)
 | ||||||
|  | +		fatal("memory allocation failure in %s:%d",
 | ||||||
|  | +		      __FILE__, __LINE__);
 | ||||||
|  | +	*buffer = *source;
 | ||||||
|  | +	return (buffer);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  /*% | ||||||
|  |   * Send a UDP packet to the remote nameserver, possible starting the | ||||||
|  |   * recv action as well.  Also make sure that the timer is running and | ||||||
|  | @@ -2567,6 +2587,7 @@ static void
 | ||||||
|  |  send_udp(dig_query_t *query) { | ||||||
|  |  	dig_lookup_t *l = NULL; | ||||||
|  |  	isc_result_t result; | ||||||
|  | +	isc_buffer_t *sendbuf;
 | ||||||
|  |   | ||||||
|  |  	debug("send_udp(%p)", query); | ||||||
|  |   | ||||||
|  | @@ -2613,14 +2634,16 @@ send_udp(dig_query_t *query) {
 | ||||||
|  |  		debug("recvcount=%d", recvcount); | ||||||
|  |  	} | ||||||
|  |  	ISC_LIST_INIT(query->sendlist); | ||||||
|  | -	ISC_LIST_ENQUEUE(query->sendlist, &query->sendbuf, link);
 | ||||||
|  | +	sendbuf = clone_buffer(&query->sendbuf);
 | ||||||
|  | +	ISC_LIST_ENQUEUE(query->sendlist, sendbuf, link);
 | ||||||
|  |  	debug("sending a request"); | ||||||
|  |  	TIME_NOW(&query->time_sent); | ||||||
|  |  	INSIST(query->sock != NULL); | ||||||
|  |  	query->waiting_senddone = ISC_TRUE; | ||||||
|  | -	result = isc_socket_sendtov(query->sock, &query->sendlist,
 | ||||||
|  | -				    global_task, send_done, query,
 | ||||||
|  | -				    &query->sockaddr, NULL);
 | ||||||
|  | +	result = isc_socket_sendtov2(query->sock, &query->sendlist,
 | ||||||
|  | +				     global_task, send_done, query,
 | ||||||
|  | +				     &query->sockaddr, NULL,
 | ||||||
|  | +				     ISC_SOCKFLAG_NORETRY);
 | ||||||
|  |  	check_result(result, "isc_socket_sendtov"); | ||||||
|  |  	sendcount++; | ||||||
|  |  } | ||||||
|  | @@ -2782,6 +2805,7 @@ static void
 | ||||||
|  |  launch_next_query(dig_query_t *query, isc_boolean_t include_question) { | ||||||
|  |  	isc_result_t result; | ||||||
|  |  	dig_lookup_t *l; | ||||||
|  | +	isc_buffer_t *buffer;
 | ||||||
|  |   | ||||||
|  |  	INSIST(!free_now); | ||||||
|  |   | ||||||
|  | @@ -2805,9 +2829,13 @@ launch_next_query(dig_query_t *query, isc_boolean_t include_question) {
 | ||||||
|  |  	isc_buffer_putuint16(&query->slbuf, (isc_uint16_t) query->sendbuf.used); | ||||||
|  |  	ISC_LIST_INIT(query->sendlist); | ||||||
|  |  	ISC_LINK_INIT(&query->slbuf, link); | ||||||
|  | -	ISC_LIST_ENQUEUE(query->sendlist, &query->slbuf, link);
 | ||||||
|  | -	if (include_question)
 | ||||||
|  | -		ISC_LIST_ENQUEUE(query->sendlist, &query->sendbuf, link);
 | ||||||
|  | +	buffer = clone_buffer(&query->slbuf);
 | ||||||
|  | +	ISC_LIST_ENQUEUE(query->sendlist, buffer, link);
 | ||||||
|  | +	if (include_question) {
 | ||||||
|  | +		buffer = clone_buffer(&query->sendbuf);
 | ||||||
|  | +		ISC_LIST_ENQUEUE(query->sendlist, buffer, link);
 | ||||||
|  | +	}
 | ||||||
|  | +
 | ||||||
|  |  	ISC_LINK_INIT(&query->lengthbuf, link); | ||||||
|  |  	ISC_LIST_ENQUEUE(query->lengthlist, &query->lengthbuf, link); | ||||||
|  |   | ||||||
|  | diff --git a/bin/dig/host.c b/bin/dig/host.c
 | ||||||
|  | index 49fe991..3cb3ddf 100644
 | ||||||
|  | --- a/bin/dig/host.c
 | ||||||
|  | +++ b/bin/dig/host.c
 | ||||||
|  | @@ -638,6 +638,8 @@ pre_parse_args(int argc, char **argv) {
 | ||||||
|  |  		case 'w': break; | ||||||
|  |  		case 'C': break; | ||||||
|  |  		case 'D': | ||||||
|  | +			if (debugging)
 | ||||||
|  | +				debugtiming = ISC_TRUE;
 | ||||||
|  |  			debugging = ISC_TRUE; | ||||||
|  |  			break; | ||||||
|  |  		case 'N': break; | ||||||
|  | diff --git a/bin/dig/include/dig/dig.h b/bin/dig/include/dig/dig.h
 | ||||||
|  | index f04440c..41463d1 100644
 | ||||||
|  | --- a/bin/dig/include/dig/dig.h
 | ||||||
|  | +++ b/bin/dig/include/dig/dig.h
 | ||||||
|  | @@ -275,7 +275,7 @@ extern isc_boolean_t validated;
 | ||||||
|  |  extern isc_taskmgr_t *taskmgr; | ||||||
|  |  extern isc_task_t *global_task; | ||||||
|  |  extern isc_boolean_t free_now; | ||||||
|  | -extern isc_boolean_t debugging, memdebugging;
 | ||||||
|  | +extern isc_boolean_t debugging, debugtiming, memdebugging;
 | ||||||
|  |   | ||||||
|  |  extern char *progname; | ||||||
|  |  extern int tries; | ||||||
|  | diff --git a/lib/isc/include/isc/namespace.h b/lib/isc/include/isc/namespace.h
 | ||||||
|  | index f8744d8..e9bda5e 100644
 | ||||||
|  | --- a/lib/isc/include/isc/namespace.h
 | ||||||
|  | +++ b/lib/isc/include/isc/namespace.h
 | ||||||
|  | @@ -106,6 +106,7 @@
 | ||||||
|  |  #define isc_socket_sendv isc__socket_sendv | ||||||
|  |  #define isc_socket_sendtov isc__socket_sendtov | ||||||
|  |  #define isc_socket_sendto2 isc__socket_sendto2 | ||||||
|  | +#define isc_socket_sendtov2 isc__socket_sendtov2
 | ||||||
|  |  #define isc_socket_cleanunix isc__socket_cleanunix | ||||||
|  |  #define isc_socket_permunix isc__socket_permunix | ||||||
|  |  #define isc_socket_bind isc__socket_bind | ||||||
|  | diff --git a/lib/isc/include/isc/socket.h b/lib/isc/include/isc/socket.h
 | ||||||
|  | index 9d086b4..c5a753a 100644
 | ||||||
|  | --- a/lib/isc/include/isc/socket.h
 | ||||||
|  | +++ b/lib/isc/include/isc/socket.h
 | ||||||
|  | @@ -866,6 +866,11 @@ isc_socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
 | ||||||
|  |  		   isc_task_t *task, isc_taskaction_t action, const void *arg, | ||||||
|  |  		   isc_sockaddr_t *address, struct in6_pktinfo *pktinfo); | ||||||
|  |  isc_result_t | ||||||
|  | +isc_socket_sendtov2(isc_socket_t *sock, isc_bufferlist_t *buflist,
 | ||||||
|  | +		    isc_task_t *task, isc_taskaction_t action, const void *arg,
 | ||||||
|  | +		    isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
 | ||||||
|  | +		    unsigned int flags);
 | ||||||
|  | +isc_result_t
 | ||||||
|  |  isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region, | ||||||
|  |  		   isc_task_t *task, | ||||||
|  |  		   isc_sockaddr_t *address, struct in6_pktinfo *pktinfo, | ||||||
|  | diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c
 | ||||||
|  | index dc0b141..9b99acb 100644
 | ||||||
|  | --- a/lib/isc/unix/socket.c
 | ||||||
|  | +++ b/lib/isc/unix/socket.c
 | ||||||
|  | @@ -505,6 +505,11 @@ isc__socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
 | ||||||
|  |  		    isc_task_t *task, isc_taskaction_t action, const void *arg, | ||||||
|  |  		    isc_sockaddr_t *address, struct in6_pktinfo *pktinfo); | ||||||
|  |  ISC_SOCKETFUNC_SCOPE isc_result_t | ||||||
|  | +isc__socket_sendtov2(isc_socket_t *sock, isc_bufferlist_t *buflist,
 | ||||||
|  | +		     isc_task_t *task, isc_taskaction_t action, const void *arg,
 | ||||||
|  | +		     isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
 | ||||||
|  | +		     unsigned int flags);
 | ||||||
|  | +ISC_SOCKETFUNC_SCOPE isc_result_t
 | ||||||
|  |  isc__socket_sendto2(isc_socket_t *sock, isc_region_t *region, | ||||||
|  |  		    isc_task_t *task, | ||||||
|  |  		    isc_sockaddr_t *address, struct in6_pktinfo *pktinfo, | ||||||
|  | @@ -4791,15 +4796,25 @@ ISC_SOCKETFUNC_SCOPE isc_result_t
 | ||||||
|  |  isc__socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist, | ||||||
|  |  		  isc_task_t *task, isc_taskaction_t action, const void *arg) | ||||||
|  |  { | ||||||
|  | -	return (isc__socket_sendtov(sock, buflist, task, action, arg, NULL,
 | ||||||
|  | -				    NULL));
 | ||||||
|  | +	return (isc__socket_sendtov2(sock, buflist, task, action, arg, NULL,
 | ||||||
|  | +				     NULL, 0));
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  ISC_SOCKETFUNC_SCOPE isc_result_t | ||||||
|  | -isc__socket_sendtov(isc_socket_t *sock0, isc_bufferlist_t *buflist,
 | ||||||
|  | +isc__socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
 | ||||||
|  |  		    isc_task_t *task, isc_taskaction_t action, const void *arg, | ||||||
|  |  		    isc_sockaddr_t *address, struct in6_pktinfo *pktinfo) | ||||||
|  |  { | ||||||
|  | +	return (isc__socket_sendtov2(sock, buflist, task, action, arg, address,
 | ||||||
|  | +				     pktinfo, 0));
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +ISC_SOCKETFUNC_SCOPE isc_result_t
 | ||||||
|  | +isc__socket_sendtov2(isc_socket_t *sock0, isc_bufferlist_t *buflist,
 | ||||||
|  | +		     isc_task_t *task, isc_taskaction_t action, const void *arg,
 | ||||||
|  | +		     isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
 | ||||||
|  | +		     unsigned int flags)
 | ||||||
|  | +{
 | ||||||
|  |  	isc__socket_t *sock = (isc__socket_t *)sock0; | ||||||
|  |  	isc_socketevent_t *dev; | ||||||
|  |  	isc__socketmgr_t *manager; | ||||||
|  | @@ -4832,7 +4847,7 @@ isc__socket_sendtov(isc_socket_t *sock0, isc_bufferlist_t *buflist,
 | ||||||
|  |  		buffer = ISC_LIST_HEAD(*buflist); | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	return (socket_send(sock, dev, task, address, pktinfo, 0));
 | ||||||
|  | +	return (socket_send(sock, dev, task, address, pktinfo, flags));
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  ISC_SOCKETFUNC_SCOPE isc_result_t | ||||||
| @ -1,135 +0,0 @@ | |||||||
| From 527e971a732d645d411df842ec4f8c401248ca0c Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Tomas Hozza <thozza@redhat.com> |  | ||||||
| Date: Fri, 18 Oct 2013 10:47:21 +0200 |  | ||||||
| Subject: [PATCH] Dynamically allocate send buffers when sending query |  | ||||||
| 
 |  | ||||||
| This prevents race condition, when the same buffer could be added into |  | ||||||
| multiple bufferlists. One case when this happens is when timeout of sent |  | ||||||
| UDP query expires before send_done() is called. |  | ||||||
| 
 |  | ||||||
| New function isc_buffer_cloneused() has been added, so dynamically |  | ||||||
| allocated copy of used region of a buffer can be created easily. |  | ||||||
| (It should be added into buffer.c but to prevent API change it is |  | ||||||
| in dighost.c) |  | ||||||
| 
 |  | ||||||
| All functions creating a send socket event with send_done() callback |  | ||||||
| have been modified to make dynamically allocated copies of every buffer |  | ||||||
| added into query->sendlist. This list is then bounded to the send socket |  | ||||||
| event. This way the same buffer can not be anymore added to the same |  | ||||||
| bufferlist. Previously allocated copies of buffers are freed in |  | ||||||
| send_done() callback. |  | ||||||
| 
 |  | ||||||
| Signed-off-by: Tomas Hozza <thozza@redhat.com> |  | ||||||
| ---
 |  | ||||||
|  bin/dig/dighost.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++----- |  | ||||||
|  1 file changed, 53 insertions(+), 5 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c
 |  | ||||||
| index 0d41529..7899c49 100644
 |  | ||||||
| --- a/bin/dig/dighost.c
 |  | ||||||
| +++ b/bin/dig/dighost.c
 |  | ||||||
| @@ -362,6 +362,36 @@ struct_tk_list tk_list = { {NULL, NULL, NULL, NULL, NULL}, 0};
 |  | ||||||
|  		     "isc_mutex_unlock");\ |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +static isc_result_t
 |  | ||||||
| +isc_buffer_cloneused(isc_mem_t *mctx, isc_buffer_t *src_buffer, isc_buffer_t **dynbuffer) {
 |  | ||||||
| +	/*
 |  | ||||||
| +	 * Make 'dynbuffer' refer to a dynamically allocated copy of used region of 'src_buffer'.
 |  | ||||||
| +	 */
 |  | ||||||
| +	isc_result_t result;
 |  | ||||||
| +	isc_region_t used_region;
 |  | ||||||
| +	isc_buffer_t *tmpbuf = NULL;
 |  | ||||||
| +
 |  | ||||||
| +	REQUIRE(dynbuffer != NULL);
 |  | ||||||
| +	REQUIRE(*dynbuffer == NULL);
 |  | ||||||
| +	REQUIRE(src_buffer != NULL);
 |  | ||||||
| +	REQUIRE(ISC_BUFFER_VALID(src_buffer));
 |  | ||||||
| +
 |  | ||||||
| +	result = isc_buffer_allocate(mctx, &tmpbuf, src_buffer->length);
 |  | ||||||
| +	if (result != ISC_R_SUCCESS)
 |  | ||||||
| +		return result;
 |  | ||||||
| +
 |  | ||||||
| +	isc_buffer_usedregion(src_buffer, &used_region);
 |  | ||||||
| +	result = isc_buffer_copyregion(tmpbuf, &used_region);
 |  | ||||||
| +	if (result != ISC_R_SUCCESS) {
 |  | ||||||
| +		isc_buffer_free(&tmpbuf);
 |  | ||||||
| +		return result;
 |  | ||||||
| +	}
 |  | ||||||
| +
 |  | ||||||
| +	*dynbuffer = tmpbuf;
 |  | ||||||
| +
 |  | ||||||
| +	return (ISC_R_SUCCESS);
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
|  static void |  | ||||||
|  cancel_lookup(dig_lookup_t *lookup); |  | ||||||
|   |  | ||||||
| @@ -2416,8 +2446,10 @@ send_done(isc_task_t *_task, isc_event_t *event) {
 |  | ||||||
|   |  | ||||||
|  	for  (b = ISC_LIST_HEAD(sevent->bufferlist); |  | ||||||
|  	      b != NULL; |  | ||||||
| -	      b = ISC_LIST_HEAD(sevent->bufferlist))
 |  | ||||||
| +	      b = ISC_LIST_HEAD(sevent->bufferlist)) {
 |  | ||||||
|  		ISC_LIST_DEQUEUE(sevent->bufferlist, b, link); |  | ||||||
| +		isc_buffer_free(&b);
 |  | ||||||
| +	}
 |  | ||||||
|   |  | ||||||
|  	query = event->ev_arg; |  | ||||||
|  	query->waiting_senddone = ISC_FALSE; |  | ||||||
| @@ -2617,6 +2649,7 @@ send_tcp_connect(dig_query_t *query) {
 |  | ||||||
|  static void |  | ||||||
|  send_udp(dig_query_t *query) { |  | ||||||
|  	dig_lookup_t *l = NULL; |  | ||||||
| +	isc_buffer_t *tmpbuf = NULL;
 |  | ||||||
|  	isc_result_t result; |  | ||||||
|   |  | ||||||
|  	debug("send_udp(%p)", query); |  | ||||||
| @@ -2663,8 +2696,14 @@ send_udp(dig_query_t *query) {
 |  | ||||||
|  		recvcount++; |  | ||||||
|  		debug("recvcount=%d", recvcount); |  | ||||||
|  	} |  | ||||||
| +	/*
 |  | ||||||
| +	 * Make a copy of the query send buffer so it is not reused
 |  | ||||||
| +	 * in multiple socket send events. The buffer is freed in send_done().
 |  | ||||||
| +	 */
 |  | ||||||
| +	result = isc_buffer_cloneused(mctx, &query->sendbuf, &tmpbuf);
 |  | ||||||
| +	check_result(result, "isc_buffer_cloneused");
 |  | ||||||
|  	ISC_LIST_INIT(query->sendlist); |  | ||||||
| -	ISC_LIST_ENQUEUE(query->sendlist, &query->sendbuf, link);
 |  | ||||||
| +	ISC_LIST_ENQUEUE(query->sendlist, tmpbuf, link);
 |  | ||||||
|  	debug("sending a request"); |  | ||||||
|  	TIME_NOW(&query->time_sent); |  | ||||||
|  	INSIST(query->sock != NULL); |  | ||||||
| @@ -2838,6 +2877,7 @@ static void
 |  | ||||||
|  launch_next_query(dig_query_t *query, isc_boolean_t include_question) { |  | ||||||
|  	isc_result_t result; |  | ||||||
|  	dig_lookup_t *l; |  | ||||||
| +	isc_buffer_t *tmpbuf = NULL;
 |  | ||||||
|   |  | ||||||
|  	INSIST(!free_now); |  | ||||||
|   |  | ||||||
| @@ -2861,9 +2901,17 @@ launch_next_query(dig_query_t *query, isc_boolean_t include_question) {
 |  | ||||||
|  	isc_buffer_putuint16(&query->slbuf, (isc_uint16_t) query->sendbuf.used); |  | ||||||
|  	ISC_LIST_INIT(query->sendlist); |  | ||||||
|  	ISC_LINK_INIT(&query->slbuf, link); |  | ||||||
| -	ISC_LIST_ENQUEUE(query->sendlist, &query->slbuf, link);
 |  | ||||||
| -	if (include_question)
 |  | ||||||
| -		ISC_LIST_ENQUEUE(query->sendlist, &query->sendbuf, link);
 |  | ||||||
| +
 |  | ||||||
| +	/* need to clone send buffers as they are freed in send_done() */
 |  | ||||||
| +	result = isc_buffer_cloneused(mctx, &query->slbuf, &tmpbuf);
 |  | ||||||
| +	check_result(result, "isc_buffer_cloneused");
 |  | ||||||
| +	ISC_LIST_ENQUEUE(query->sendlist, tmpbuf, link);
 |  | ||||||
| +	if (include_question) {
 |  | ||||||
| +		tmpbuf = NULL;
 |  | ||||||
| +		result = isc_buffer_cloneused(mctx, &query->sendbuf, &tmpbuf);
 |  | ||||||
| +		check_result(result, "isc_buffer_cloneused");
 |  | ||||||
| +		ISC_LIST_ENQUEUE(query->sendlist, tmpbuf, link);
 |  | ||||||
| +	}
 |  | ||||||
|  	ISC_LINK_INIT(&query->lengthbuf, link); |  | ||||||
|  	ISC_LIST_ENQUEUE(query->lengthlist, &query->lengthbuf, link); |  | ||||||
|   |  | ||||||
| -- 
 |  | ||||||
| 1.8.3.1 |  | ||||||
| 
 |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user