From 3c671ac666de8a7dcd7bd02afa20968da0b85bbd Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Tue, 20 Jun 2000 23:52:54 +0000 Subject: [PATCH] 264. [func] Dispatch can not take TCP sockets in connecting state. Set DNS_DISPATCHATTR_CONNECTED when calling dns_dispatch_createtcp() for connected TCP sockets or call dns_dispatch_starttcp() when the socket is connected. --- CHANGES | 10 ++++++++++ bin/tests/dispatch_tcp_test.c | 1 + lib/dns/dispatch.c | 17 ++++++++++++++++- lib/dns/include/dns/dispatch.h | 9 +++++++++ lib/dns/resolver.c | 1 + 5 files changed, 37 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index e7f4773ff2..335f56d319 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,13 @@ + 266. [bug] zone.c:save_nsrrset() node was not initalised. + + 265. [bug] dns_request_create() not works for TCP. + + 264. [func] Dispatch can not take TCP sockets in connecting + state. Set DNS_DISPATCHATTR_CONNECTED when calling + dns_dispatch_createtcp() for connected TCP sockets + or call dns_dispatch_starttcp() when the socket is + connected. + 263. [func] New logging channel type 'stderr' channel some-name { diff --git a/bin/tests/dispatch_tcp_test.c b/bin/tests/dispatch_tcp_test.c index 236221c29e..b2ee506912 100644 --- a/bin/tests/dispatch_tcp_test.c +++ b/bin/tests/dispatch_tcp_test.c @@ -111,6 +111,7 @@ my_accept(isc_task_t *task, isc_event_t *ev_in) { attrs = 0; attrs |= DNS_DISPATCHATTR_IPV4; attrs |= DNS_DISPATCHATTR_TCP; + attrs |= DNS_DISPATCHATTR_CONNECTED; disp = NULL; RUNTIME_CHECK(dns_dispatch_createtcp(dispatchmgr, ev->newsocket, taskmgr, 4096, 64, 1024, diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index dfeb3ea27c..1809bc00eb 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -1643,7 +1643,9 @@ dns_dispatch_addresponse(dns_dispatch_t *disp, isc_sockaddr_t *dest, request_log(disp, res, LVL(90), "attached to task %p", res->task); - startrecv(disp); + if (((disp->attributes & DNS_DISPATCHATTR_UDP) != 0) || + ((disp->attributes & DNS_DISPATCHATTR_CONNECTED) != 0)) + startrecv(disp); UNLOCK(&disp->lock); @@ -1653,6 +1655,19 @@ dns_dispatch_addresponse(dns_dispatch_t *disp, isc_sockaddr_t *dest, return (ISC_R_SUCCESS); } +void +dns_dispatch_starttcp(dns_dispatch_t *disp) { + + REQUIRE(VALID_DISPATCH(disp)); + + dispatch_log(disp, LVL(90), "starttcp %p", disp->task); + + LOCK(&disp->lock); + disp->attributes |= DNS_DISPATCHATTR_CONNECTED; + startrecv(disp); + UNLOCK(&disp->lock); +} + void dns_dispatch_removeresponse(dns_dispentry_t **resp, dns_dispatchevent_t **sockevent) diff --git a/lib/dns/include/dns/dispatch.h b/lib/dns/include/dns/dispatch.h index 52025863a5..945ae5b6ce 100644 --- a/lib/dns/include/dns/dispatch.h +++ b/lib/dns/include/dns/dispatch.h @@ -117,6 +117,7 @@ struct dns_dispatchevent { #define DNS_DISPATCHATTR_IPV6 0x00000010U #define DNS_DISPATCHATTR_ACCEPTREQUEST 0x00000020U #define DNS_DISPATCHATTR_MAKEQUERY 0x00000040U +#define DNS_DISPATCHATTR_CONNECTED 0x00000080U ISC_LANG_BEGINDECLS @@ -258,6 +259,14 @@ dns_dispatch_detach(dns_dispatch_t **dispp); * < mumble > */ +void +dns_dispatch_starttcp(dns_dispatch_t *disp); +/* + * Start processing of a TCP dispatch. + * + * Requires: + * 'disp' is valid. + */ isc_result_t dns_dispatch_addresponse(dns_dispatch_t *disp, isc_sockaddr_t *dest, diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 0c64d8c8c6..90cea5ab3a 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -1036,6 +1036,7 @@ resquery_connected(isc_task_t *task, isc_event_t *event) { attrs = 0; attrs |= DNS_DISPATCHATTR_TCP; attrs |= DNS_DISPATCHATTR_PRIVATE; + attrs |= DNS_DISPATCHATTR_CONNECTED; if (isc_sockaddr_pf(&query->addrinfo->sockaddr) == AF_INET) attrs |= DNS_DISPATCHATTR_IPV4;