2039. [func] Check that all buffers passed to the socket code
have been retrieve when the socket event is freed.
[RT #16122]
2038. [bug] dig/nslookup/host was unlinking from wrong list
when handling errors. [RT #16122]
This commit is contained in:
7
CHANGES
7
CHANGES
@@ -1,3 +1,10 @@
|
||||
2039. [func] Check that all buffers passed to the socket code
|
||||
have been retrieve when the socket event is freed.
|
||||
[RT #16122]
|
||||
|
||||
2038. [bug] dig/nslookup/host was unlinking from wrong list
|
||||
when handling errors. [RT #16122]
|
||||
|
||||
2037. [func] When unlinking the first or last element in a list
|
||||
check that the list head points to the element to
|
||||
be unlinked. [RT #15959]
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: dighost.c,v 1.259.18.32 2006/02/17 00:14:21 marka Exp $ */
|
||||
/* $Id: dighost.c,v 1.259.18.33 2006/06/06 00:56:09 marka Exp $ */
|
||||
|
||||
/*! \file
|
||||
* \note
|
||||
@@ -2026,12 +2026,20 @@ setup_lookup(dig_lookup_t *lookup) {
|
||||
*/
|
||||
static void
|
||||
send_done(isc_task_t *_task, isc_event_t *event) {
|
||||
isc_socketevent_t *sevent = (isc_socketevent_t *)event;
|
||||
isc_buffer_t *b = NULL;
|
||||
|
||||
REQUIRE(event->ev_type == ISC_SOCKEVENT_SENDDONE);
|
||||
|
||||
UNUSED(_task);
|
||||
|
||||
LOCK_LOOKUP;
|
||||
|
||||
for (b = ISC_LIST_HEAD(sevent->bufferlist);
|
||||
b != NULL;
|
||||
b = ISC_LIST_HEAD(sevent->bufferlist))
|
||||
ISC_LIST_DEQUEUE(sevent->bufferlist, b, link);
|
||||
|
||||
isc_event_free(&event);
|
||||
|
||||
debug("send_done()");
|
||||
@@ -2332,6 +2340,10 @@ tcp_length_done(isc_task_t *task, isc_event_t *event) {
|
||||
recvcount--;
|
||||
INSIST(recvcount >= 0);
|
||||
|
||||
b = ISC_LIST_HEAD(sevent->bufferlist);
|
||||
INSIST(b == &query->lengthbuf);
|
||||
ISC_LIST_DEQUEUE(sevent->bufferlist, b, link);
|
||||
|
||||
if (sevent->result == ISC_R_CANCELED) {
|
||||
isc_event_free(&event);
|
||||
l = query->lookup;
|
||||
@@ -2357,8 +2369,6 @@ tcp_length_done(isc_task_t *task, isc_event_t *event) {
|
||||
UNLOCK_LOOKUP;
|
||||
return;
|
||||
}
|
||||
b = ISC_LIST_HEAD(sevent->bufferlist);
|
||||
ISC_LIST_DEQUEUE(sevent->bufferlist, &query->lengthbuf, link);
|
||||
length = isc_buffer_getuint16(b);
|
||||
if (length == 0) {
|
||||
isc_event_free(&event);
|
||||
@@ -2720,6 +2730,10 @@ recv_done(isc_task_t *task, isc_event_t *event) {
|
||||
REQUIRE(event->ev_type == ISC_SOCKEVENT_RECVDONE);
|
||||
sevent = (isc_socketevent_t *)event;
|
||||
|
||||
b = ISC_LIST_HEAD(sevent->bufferlist);
|
||||
INSIST(b == &query->recvbuf);
|
||||
ISC_LIST_DEQUEUE(sevent->bufferlist, &query->recvbuf, link);
|
||||
|
||||
if ((l->tcp_mode) && (l->timer != NULL))
|
||||
isc_timer_touch(l->timer);
|
||||
if ((!l->pending && !l->ns_search_only) || cancel_now) {
|
||||
@@ -2753,9 +2767,6 @@ recv_done(isc_task_t *task, isc_event_t *event) {
|
||||
return;
|
||||
}
|
||||
|
||||
b = ISC_LIST_HEAD(sevent->bufferlist);
|
||||
ISC_LIST_DEQUEUE(sevent->bufferlist, &query->recvbuf, link);
|
||||
|
||||
if (!l->tcp_mode &&
|
||||
!isc_sockaddr_compare(&sevent->address, &query->sockaddr,
|
||||
ISC_SOCKADDR_CMPADDR|
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: socket.h,v 1.57.18.4 2005/10/17 03:50:11 marka Exp $ */
|
||||
/* $Id: socket.h,v 1.57.18.5 2006/06/06 00:56:09 marka Exp $ */
|
||||
|
||||
#ifndef ISC_SOCKET_H
|
||||
#define ISC_SOCKET_H 1
|
||||
@@ -93,6 +93,7 @@ struct isc_socketevent {
|
||||
isc_time_t timestamp; /*%< timestamp of packet recv */
|
||||
struct in6_pktinfo pktinfo; /*%< ipv6 pktinfo */
|
||||
isc_uint32_t attributes; /*%< see below */
|
||||
isc_eventdestructor_t destroy; /*%< original destructor */
|
||||
};
|
||||
|
||||
typedef struct isc_socket_newconnev isc_socket_newconnev_t;
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: socket.c,v 1.237.18.23 2006/05/19 02:49:29 marka Exp $ */
|
||||
/* $Id: socket.c,v 1.237.18.24 2006/06/06 00:56:09 marka Exp $ */
|
||||
|
||||
/*! \file */
|
||||
|
||||
@@ -881,6 +881,15 @@ set_dev_address(isc_sockaddr_t *address, isc_socket_t *sock,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_socketevent(isc_event_t *event) {
|
||||
isc_socketevent_t *ev = (isc_socketevent_t *)event;
|
||||
|
||||
INSIST(ISC_LIST_EMPTY(ev->bufferlist));
|
||||
|
||||
(ev->destroy)(event);
|
||||
}
|
||||
|
||||
static isc_socketevent_t *
|
||||
allocate_socketevent(isc_socket_t *sock, isc_eventtype_t eventtype,
|
||||
isc_taskaction_t action, const void *arg)
|
||||
@@ -902,6 +911,8 @@ allocate_socketevent(isc_socket_t *sock, isc_eventtype_t eventtype,
|
||||
ev->n = 0;
|
||||
ev->offset = 0;
|
||||
ev->attributes = 0;
|
||||
ev->destroy = ev->ev_destroy;
|
||||
ev->ev_destroy = destroy_socketevent;
|
||||
|
||||
return (ev);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: socket.c,v 1.30.18.13 2006/01/07 00:23:34 marka Exp $ */
|
||||
/* $Id: socket.c,v 1.30.18.14 2006/06/06 00:56:09 marka Exp $ */
|
||||
|
||||
/* This code has been rewritten to take advantage of Windows Sockets
|
||||
* I/O Completion Ports and Events. I/O Completion Ports is ONLY
|
||||
@@ -1304,6 +1304,15 @@ set_dev_address(isc_sockaddr_t *address, isc_socket_t *sock,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_socketevent(isc_event_t *event) {
|
||||
isc_socketevent_t *ev = (isc_socketevent_t *)event;
|
||||
|
||||
INSIST(ISC_LIST_EMPTY(ev->bufferlist));
|
||||
|
||||
(ev->destroy)(event);
|
||||
}
|
||||
|
||||
static isc_socketevent_t *
|
||||
allocate_socketevent(isc_socket_t *sock, isc_eventtype_t eventtype,
|
||||
isc_taskaction_t action, const void *arg)
|
||||
@@ -1324,6 +1333,8 @@ allocate_socketevent(isc_socket_t *sock, isc_eventtype_t eventtype,
|
||||
ev->n = 0;
|
||||
ev->offset = 0;
|
||||
ev->attributes = 0;
|
||||
ev->destroy = ev->ev_destroy;
|
||||
ev->ev_destroy = destroy_socketevent;
|
||||
|
||||
return (ev);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user