mirror of
https://github.com/isc-projects/bind9.git
synced 2026-02-23 18:04:10 -05:00
Synchronize dns_request_createraw() and dns_request_create() UDP timeout
The dns_request_createraw() function, unlike dns_request_create(), when calculating the UDP timeout value, doesn't check that 'udpretries' is not zero, and that is the more logical behavior, because the calculation formula uses division to 'udpretries + 1', where '1' is the first try. Change the dns_request_create() function to remove the 'udpretries != 0' condition. Add a 'REQUIRE(udpretries != UINT_MAX)' check to protect from a division by zero. Make the 'request->udpcount' field to represent the number of tries, instead of the number of retries.
This commit is contained in:
parent
0ef11c0ccb
commit
643abfbba7
1 changed files with 9 additions and 8 deletions
|
|
@ -421,6 +421,8 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
|
|||
REQUIRE(cb != NULL);
|
||||
REQUIRE(requestp != NULL && *requestp == NULL);
|
||||
REQUIRE(timeout > 0);
|
||||
REQUIRE(udpretries != UINT_MAX);
|
||||
|
||||
if (srcaddr != NULL) {
|
||||
REQUIRE(isc_sockaddr_pf(srcaddr) == isc_sockaddr_pf(destaddr));
|
||||
}
|
||||
|
|
@ -447,7 +449,7 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
|
|||
request->cb = cb;
|
||||
request->arg = arg;
|
||||
request->result = ISC_R_FAILURE;
|
||||
request->udpcount = udpretries;
|
||||
request->udpcount = udpretries + 1;
|
||||
|
||||
isc_buffer_usedregion(msgbuf, &r);
|
||||
if (r.length < DNS_MESSAGE_HEADERLEN || r.length > 65535) {
|
||||
|
|
@ -460,7 +462,7 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
|
|||
request->timeout = timeout * 1000;
|
||||
} else {
|
||||
if (udptimeout == 0) {
|
||||
udptimeout = timeout / (udpretries + 1);
|
||||
udptimeout = timeout / request->udpcount;
|
||||
}
|
||||
if (udptimeout == 0) {
|
||||
udptimeout = 1;
|
||||
|
|
@ -569,6 +571,7 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
|||
REQUIRE(cb != NULL);
|
||||
REQUIRE(requestp != NULL && *requestp == NULL);
|
||||
REQUIRE(timeout > 0);
|
||||
REQUIRE(udpretries != UINT_MAX);
|
||||
|
||||
mctx = requestmgr->mctx;
|
||||
|
||||
|
|
@ -598,9 +601,7 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
|||
request->cb = cb;
|
||||
request->arg = arg;
|
||||
request->result = ISC_R_FAILURE;
|
||||
request->udpcount = udpretries;
|
||||
|
||||
request->udpcount = udpretries;
|
||||
request->udpcount = udpretries + 1;
|
||||
|
||||
if (key != NULL) {
|
||||
dns_tsigkey_attach(key, &request->tsigkey);
|
||||
|
|
@ -615,8 +616,8 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
|||
tcp = true;
|
||||
request->timeout = timeout * 1000;
|
||||
} else {
|
||||
if (udptimeout == 0 && udpretries != 0) {
|
||||
udptimeout = timeout / (udpretries + 1);
|
||||
if (udptimeout == 0) {
|
||||
udptimeout = timeout / request->udpcount;
|
||||
}
|
||||
if (udptimeout == 0) {
|
||||
udptimeout = 1;
|
||||
|
|
@ -973,7 +974,7 @@ req_response(isc_result_t result, isc_region_t *region, void *arg) {
|
|||
|
||||
if (result == ISC_R_TIMEDOUT) {
|
||||
LOCK(&request->requestmgr->locks[request->hash]);
|
||||
if (request->udpcount != 0) {
|
||||
if (request->udpcount > 1) {
|
||||
request->udpcount -= 1;
|
||||
dns_dispatch_resume(request->dispentry,
|
||||
request->timeout);
|
||||
|
|
|
|||
Loading…
Reference in a new issue