|
@@ -490,7 +490,7 @@ _del_timeout_event(u16 *lineno, struct event *ev, int line)
|
|
|
{
|
|
|
if (*lineno) {
|
|
|
log(EVDNS_LOG_WARN,
|
|
|
- "Duplicate timeout event_del from line %d: first call "
|
|
|
+ "BUG: Duplicate timeout event_del from line %d: first call "
|
|
|
"was at %d.", line, (int)*lineno);
|
|
|
return 0;
|
|
|
} else {
|
|
@@ -501,6 +501,24 @@ _del_timeout_event(u16 *lineno, struct event *ev, int line)
|
|
|
#define del_timeout_event(s) \
|
|
|
(_del_timeout_event(&(s)->timeout_event_deleted, &(s)->timeout_event, \
|
|
|
__LINE__))
|
|
|
+/* For debugging bug 929/957. XXXX021 */
|
|
|
+static int
|
|
|
+_del_timeout_event_if_set(u16 *lineno, struct event *ev, int line)
|
|
|
+{
|
|
|
+ if (*lineno == 0) {
|
|
|
+ log(EVDNS_LOG_WARN,
|
|
|
+ "BUG: Event that I thought was non-added as of line %d "
|
|
|
+ "was actually added on line %d",
|
|
|
+ line, (int)*lineno);
|
|
|
+ *lineno = line;
|
|
|
+ return event_del(ev);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#define del_timeout_event_if_set(s) \
|
|
|
+ _del_timeout_event_if_set(&(s)->timeout_event_deleted, \
|
|
|
+ &(s)->timeout_event, \
|
|
|
+ __LINE__)
|
|
|
|
|
|
/* This walks the list of inflight requests to find the */
|
|
|
/* one with a matching transaction id. Returns NULL on */
|
|
@@ -549,6 +567,7 @@ nameserver_probe_failed(struct nameserver *const ns) {
|
|
|
global_nameserver_timeouts_length - 1)];
|
|
|
ns->failed_times++;
|
|
|
|
|
|
+ del_timeout_event_if_set(ns);
|
|
|
evtimer_set(&ns->timeout_event, nameserver_prod_callback, ns);
|
|
|
if (add_timeout_event(ns, (struct timeval *) timeout) < 0) {
|
|
|
log(EVDNS_LOG_WARN,
|
|
@@ -578,6 +597,7 @@ nameserver_failed(struct nameserver *const ns, const char *msg) {
|
|
|
ns->state = 0;
|
|
|
ns->failed_times = 1;
|
|
|
|
|
|
+ del_timeout_event_if_set(ns);
|
|
|
evtimer_set(&ns->timeout_event, nameserver_prod_callback, ns);
|
|
|
if (add_timeout_event(ns, (struct timeval *) &global_nameserver_timeouts[0]) < 0) {
|
|
|
log(EVDNS_LOG_WARN,
|
|
@@ -2089,6 +2109,7 @@ evdns_request_transmit(struct evdns_request *req) {
|
|
|
/* transmitted; we need to check for timeout. */
|
|
|
log(EVDNS_LOG_DEBUG,
|
|
|
"Setting timeout for request %lx", (unsigned long) req);
|
|
|
+ del_timeout_event_if_set(req);
|
|
|
evtimer_set(&req->timeout_event, evdns_request_timeout_callback, req);
|
|
|
if (add_timeout_event(req, &global_timeout) < 0) {
|
|
|
log(EVDNS_LOG_WARN,
|
|
@@ -2297,6 +2318,7 @@ _evdns_nameserver_add_impl(const struct sockaddr *address,
|
|
|
if (!ns) return -1;
|
|
|
|
|
|
memset(ns, 0, sizeof(struct nameserver));
|
|
|
+ ns->timeout_event_deleted = __LINE__;
|
|
|
|
|
|
ns->socket = socket(PF_INET, SOCK_DGRAM, 0);
|
|
|
if (ns->socket < 0) { err = 1; goto out1; }
|
|
@@ -2531,6 +2553,7 @@ request_new(int type, const char *name, int flags,
|
|
|
}
|
|
|
|
|
|
memset(req, 0, sizeof(struct evdns_request));
|
|
|
+ req->timeout_event_deleted = __LINE__;
|
|
|
|
|
|
if (global_randomize_case) {
|
|
|
unsigned i;
|