]> granicus.if.org Git - libevent/commitdiff
Fix SEGFAULT after evdns_base_resume if no nameservers installed.
authorAzat Khuzhin <a3at.mail@gmail.com>
Fri, 10 May 2013 23:53:11 +0000 (03:53 +0400)
committerGreg Hazel <ghazel@gmail.com>
Wed, 29 May 2013 21:05:17 +0000 (14:05 -0700)
If there is no nameservers installed, using
evdns_base_nameserver_ip_add(), than evdns_base_resume() will SEGFAULT,
because of NULL dereference in evdns_requests_pump_waiting_queue()

Conflicts:
evdns.c

evdns.c

diff --git a/evdns.c b/evdns.c
index e229ab94b5b04e077acf36e5a6073fef803270e2..085f7146656dec69fe909f6dd694f25a0c37f884 100644 (file)
--- a/evdns.c
+++ b/evdns.c
@@ -727,21 +727,28 @@ request_reissue(struct request *req) {
 
 /* this function looks for space on the inflight queue and promotes */
 /* requests from the waiting queue if it can. */
+/* */
+/* TODO: */
+/* add return code, see at nameserver_pick() and other functions. */
 static void
 evdns_requests_pump_waiting_queue(struct evdns_base *base) {
        ASSERT_LOCKED(base);
        while (base->global_requests_inflight < base->global_max_requests_inflight &&
                   base->global_requests_waiting) {
                struct request *req;
-               /* move a request from the waiting queue to the inflight queue */
+
                EVUTIL_ASSERT(base->req_waiting_head);
                req = base->req_waiting_head;
+
+               req->ns = nameserver_pick(base);
+               if (!req->ns)
+                       return;
+
                evdns_request_remove(req, &base->req_waiting_head);
 
                base->global_requests_waiting--;
                base->global_requests_inflight++;
 
-               req->ns = nameserver_pick(base);
                request_trans_id_set(req, transaction_id_pick(base));
 
                evdns_request_insert(req, &REQ_HEAD(base, req->trans_id));
@@ -2441,6 +2448,7 @@ evdns_base_resume(struct evdns_base *base)
        EVDNS_LOCK(base);
        evdns_requests_pump_waiting_queue(base);
        EVDNS_UNLOCK(base);
+
        return 0;
 }