diff --git a/src/request-internal.c b/src/request-internal.c index e80e4056..cc309592 100644 --- a/src/request-internal.c +++ b/src/request-internal.c @@ -209,6 +209,7 @@ network_req_init(getdns_network_req *net_req, getdns_dns_req *owner, net_req->transport_current = 0; memset(&net_req->event, 0, sizeof(net_req->event)); net_req->keepalive_sent = 0; + net_req->badcookie_retry = 0; net_req->write_queue_tail = NULL; /* Some fields to record info for return_call_reporting */ net_req->debug_tls_auth_status = GETDNS_AUTH_NONE; diff --git a/src/stub.c b/src/stub.c index 1d89c21c..825a8236 100644 --- a/src/stub.c +++ b/src/stub.c @@ -1358,7 +1358,6 @@ stub_udp_read_cb(void *userarg) getdns_network_req *netreq = (getdns_network_req *)userarg; getdns_dns_req *dnsreq = netreq->owner; getdns_upstream *upstream = netreq->upstream; - int prev_server_cookie = 0; ssize_t read; DEBUG_STUB("%s %-35s: MSG: %p \n", STUB_DEBUG_READ, __FUNC__, (void*)netreq); @@ -1399,7 +1398,6 @@ stub_udp_read_cb(void *userarg) return; /* Cache poisoning attempt ;) */ if (netreq->owner->edns_cookies) { - prev_server_cookie = upstream->has_server_cookie; netreq->response_len = read; if (match_and_process_server_cookie(upstream, netreq)) { netreq->response_len = 0; /* 0 means error */ @@ -1434,14 +1432,14 @@ stub_udp_read_cb(void *userarg) } netreq->response_len = read; if (netreq->owner->edns_cookies - && !prev_server_cookie - && upstream->has_server_cookie /* newly learned server cookie */ + && !netreq->badcookie_retry && netreq->response_opt /* actually: assert(netreq->response_opt) */ && (netreq->response_opt[-4] << 4 | GLDNS_RCODE_WIRE(netreq->response)) == GETDNS_RCODE_BADCOOKIE && netreq->fd >= 0) { /* Retry over UDP with the newly learned Cookie */ + netreq->badcookie_retry = 1; GETDNS_SCHEDULE_EVENT(dnsreq->loop, netreq->fd, _getdns_ms_until_expiry(dnsreq->expires), getdns_eventloop_event_init(&netreq->event, netreq, diff --git a/src/types-internal.h b/src/types-internal.h index 9c56ef5f..4c28b88a 100644 --- a/src/types-internal.h +++ b/src/types-internal.h @@ -233,8 +233,6 @@ typedef struct getdns_network_req int edns_maximum_udp_payload_size; uint16_t max_udp_payload_size; - size_t keepalive_sent; - /* Network requests scheduled to write after me */ struct getdns_network_req *write_queue_tail; @@ -244,7 +242,11 @@ typedef struct getdns_network_req getdns_auth_state_t debug_tls_auth_status; getdns_bindata debug_tls_peer_cert; const char *debug_tls_version; - size_t debug_udp; + + /* Some booleans */ + unsigned debug_udp : 1; + unsigned keepalive_sent : 1; + unsigned badcookie_retry: 1; /* When more space is needed for the wire_data response than is * available in wire_data[], it will be allocated separately.