diff --git a/lib/dns/adb.c b/lib/dns/adb.c index e656c121cc..7aa11e0a29 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -3465,21 +3465,26 @@ dns_adb_setcookie(dns_adb_t *adb, dns_adbaddrinfo_t *addr, } size_t -dns_adb_getcookie(dns_adb_t *adb, dns_adbaddrinfo_t *addr, - unsigned char *cookie, size_t len) { - REQUIRE(DNS_ADB_VALID(adb)); +dns_adb_getcookie(dns_adbaddrinfo_t *addr, unsigned char *cookie, size_t len) { REQUIRE(DNS_ADBADDRINFO_VALID(addr)); dns_adbentry_t *entry = addr->entry; LOCK(&entry->lock); - if (cookie != NULL && entry->cookie != NULL && len >= entry->cookielen) - { - memmove(cookie, entry->cookie, entry->cookielen); - len = entry->cookielen; - } else { + if (entry->cookie == NULL) { len = 0; + goto unlock; } + if (cookie != NULL) { + if (len < entry->cookielen) { + len = 0; + goto unlock; + } + memmove(cookie, entry->cookie, entry->cookielen); + } + len = entry->cookielen; + +unlock: UNLOCK(&entry->lock); return (len); diff --git a/lib/dns/include/dns/adb.h b/lib/dns/include/dns/adb.h index 3a0a51e2d4..7cee32f3e4 100644 --- a/lib/dns/include/dns/adb.h +++ b/lib/dns/include/dns/adb.h @@ -671,19 +671,17 @@ dns_adb_setcookie(dns_adb_t *adb, dns_adbaddrinfo_t *addr, */ size_t -dns_adb_getcookie(dns_adb_t *adb, dns_adbaddrinfo_t *addr, - unsigned char *cookie, size_t len); +dns_adb_getcookie(dns_adbaddrinfo_t *addr, unsigned char *cookie, size_t len); /* - * Retrieve the saved COOKIE value and store it in 'cookie' which has - * size 'len'. + * If 'cookie' is not NULL, then retrieve the saved COOKIE value and store it + * in 'cookie' which has size 'len'. * * Requires: - *\li 'adb' is valid. *\li 'addr' is valid. * * Returns: - * The size of the cookie or zero if it doesn't fit in the buffer - * or it doesn't exist. + * The size of the cookie or zero if it doesn't exist, or when 'cookie' is + * not NULL and it doesn't fit in the buffer. */ void diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index c78402a4e9..3db50f2cee 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -2744,8 +2744,8 @@ resquery_send(resquery_t *query) { ednsopts[ednsopt].code = DNS_OPT_COOKIE; ednsopts[ednsopt].length = (uint16_t)dns_adb_getcookie( - fctx->adb, query->addrinfo, - cookie, sizeof(cookie)); + query->addrinfo, cookie, + sizeof(cookie)); if (ednsopts[ednsopt].length != 0) { ednsopts[ednsopt].value = cookie; inc_stats( @@ -7658,9 +7658,8 @@ resquery_response(isc_result_t eresult, isc_region_t *region, void *arg) { !query->rmessage->cc_ok && !query->rmessage->cc_bad && (rctx.retryopts & DNS_FETCHOPT_TCP) == 0) { - unsigned char cookie[COOKIE_BUFFER_SIZE]; - if (dns_adb_getcookie(fctx->adb, query->addrinfo, cookie, - sizeof(cookie)) > CLIENT_COOKIE_SIZE) + if (dns_adb_getcookie(query->addrinfo, NULL, 0) > + CLIENT_COOKIE_SIZE) { if (isc_log_wouldlog(dns_lctx, ISC_LOG_INFO)) { char addrbuf[ISC_SOCKADDR_FORMATSIZE];