]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix various bugs reported by valgrind --tool=memcheck (#46978)
authorMukund Sivaraman <muks@isc.org>
Fri, 12 Jan 2018 19:01:30 +0000 (00:31 +0530)
committerMukund Sivaraman <muks@isc.org>
Fri, 12 Jan 2018 19:10:24 +0000 (00:40 +0530)
(cherry picked from commit f96133826e3f70efea237b7fe6a47a45a35a6ab0)
(cherry picked from commit 0374e1c3fdc13a20648d9c9de5601ad042e6044d)

13 files changed:
CHANGES
lib/dns/include/dns/nta.h
lib/dns/include/dns/zone.h
lib/dns/nta.c
lib/dns/rdataslab.c
lib/dns/resolver.c
lib/dns/win32/libdns.def.in
lib/dns/zone.c
lib/isc/unix/socket.c
lib/ns/client.c
lib/ns/include/ns/client.h
lib/ns/notify.c
lib/ns/win32/libns.def

diff --git a/CHANGES b/CHANGES
index e47c2397db4fca4d586ce6a4cfc3986909b76039..8947a5893d5044d67823209b3f702a849f0c3b02 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
        --- 9.12.0rc3 released ---
 
+4863.  [bug]           Fix various other bugs reported by Valgrind's
+                       memcheck tool. [RT #46978]
+
 4862.  [bug]           The rdata flags for RRSIG were not being properly set
                        when constructing a rdataslab. [RT #46978]
 
index 86a723008c04aeda6ac785e32735ef464fada042..991a57fff12daa52d6273c70f48880550aff0ea5 100644 (file)
@@ -41,7 +41,6 @@ struct dns_ntatable {
        unsigned int            magic;
        dns_view_t              *view;
        isc_rwlock_t            rwlock;
-       isc_uint32_t            recheck;
        isc_taskmgr_t           *taskmgr;
        isc_timermgr_t          *timermgr;
        isc_task_t              *task;
index 7412ad7d114a75f419ac3c7050ade8dada1d5d1e..fa1f82cdb59ca519a1e814647f8084f6492c6c1e 100644 (file)
@@ -1264,6 +1264,9 @@ dns_zone_getjournalsize(dns_zone_t *zone);
 isc_result_t
 dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
                       dns_message_t *msg);
+isc_result_t
+dns_zone_notifyreceive2(dns_zone_t *zone, isc_sockaddr_t *from,
+                       isc_sockaddr_t *to, dns_message_t *msg);
 /*%<
  *     Tell the zone that it has received a NOTIFY message from another
  *     server.  This may cause some zone maintenance activity to occur.
index 6823a525d2ff53c6c45873e2828029f86e68ea8c..46189c8b27940f4491ec12c0e1d993f9d0d66d7d 100644 (file)
@@ -238,7 +238,7 @@ fetch_done(isc_task_t *task, isc_event_t *event) {
         * If we're expiring before the next recheck, we might
         * as well stop the timer now.
         */
-       if (nta->timer != NULL && nta->expiry - now < ntatable->recheck)
+       if (nta->timer != NULL && nta->expiry - now < view->nta_recheck)
                (void) isc_timer_reset(nta->timer, isc_timertype_inactive,
                                       NULL, NULL, ISC_TRUE);
        nta_detach(view->mctx, &nta);
index 8d3edc95c170a187ea13faae92a176743cd14158..e59e065b8153e2bd6650ce2bd3e689dfb36429cf 100644 (file)
@@ -288,7 +288,9 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
        region->base = rawbuf;
        region->length = buflen;
 
+       memset(rawbuf, 0, buflen);
        rawbuf += reservelen;
+
 #if DNS_RDATASET_FIXED
        offsetbase = rawbuf;
 #endif
index ecff2dda329bb68942d91c79946513a8633490d2..f0dcd483f009df0fd2f64c041e29a0cb3c64fda0 100644 (file)
@@ -1888,6 +1888,7 @@ fctx_query(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
        query->sends = 0;
        query->connects = 0;
        query->dscp = addrinfo->dscp;
+       query->udpsize = 0;
        /*
         * Note that the caller MUST guarantee that 'addrinfo' will remain
         * valid until this query is canceled.
index 8f71c0a3e2aa13b18f73ab70852d73386e4fa20e..f25e73c1996384925235dc88eba9f68ae2f1c84a 100644 (file)
@@ -1271,6 +1271,7 @@ dns_zone_nameonly
 dns_zone_next
 dns_zone_notify
 dns_zone_notifyreceive
+dns_zone_notifyreceive2
 dns_zone_nscheck
 dns_zone_refresh
 dns_zone_rekey
index 221308cda1220df6316f2726835afd816a368fbc..0b4af996f12b73591c5be0fe3bdc4a340f6ecc6b 100644 (file)
@@ -1063,6 +1063,7 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
        zone->rss_event = NULL;
        zone->rss_state = NULL;
        zone->updatemethod = dns_updatemethod_increment;
+       zone->maxrecords = 0U;
 
        zone->magic = ZONE_MAGIC;
 
@@ -13156,6 +13157,13 @@ notify_createmessage(dns_zone_t *zone, unsigned int flags,
 isc_result_t
 dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
                       dns_message_t *msg)
+{
+       return (dns_zone_notifyreceive2(zone, from, NULL, msg));
+}
+
+isc_result_t
+dns_zone_notifyreceive2(dns_zone_t *zone, isc_sockaddr_t *from,
+                       isc_sockaddr_t *to, dns_message_t *msg)
 {
        unsigned int i;
        dns_rdata_soa_t soa;
@@ -13165,7 +13173,6 @@ dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
        char fromtext[ISC_SOCKADDR_FORMATSIZE];
        int match = 0;
        isc_netaddr_t netaddr;
-       isc_sockaddr_t local, remote;
        isc_uint32_t serial = 0;
        isc_boolean_t have_serial = ISC_FALSE;
        dns_tsigkey_t *tsigkey;
@@ -13201,7 +13208,7 @@ dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
        LOCK_ZONE(zone);
        INSIST(zone != zone->raw);
        if (inline_secure(zone)) {
-               result = dns_zone_notifyreceive(zone->raw, from, msg);
+               result = dns_zone_notifyreceive2(zone->raw, from, to, msg);
                UNLOCK_ZONE(zone);
                return (result);
        }
@@ -13345,10 +13352,11 @@ dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
                dns_zone_log(zone, ISC_LOG_INFO, "notify from %s: no serial",
                             fromtext);
        zone->notifyfrom = *from;
-       remote = zone->masteraddr;
-       local = zone->sourceaddr;
        UNLOCK_ZONE(zone);
-       dns_zonemgr_unreachabledel(zone->zmgr, &remote, &local);
+
+       if (to != NULL) {
+               dns_zonemgr_unreachabledel(zone->zmgr, from, to);
+       }
        dns_zone_refresh(zone);
        return (ISC_R_SUCCESS);
 }
@@ -19010,6 +19018,7 @@ dns_zone_setnsec3param(dns_zone_t *zone, isc_uint8_t hash, isc_uint8_t flags,
                dns_nsec3param_toprivate(&nrdata, &prdata, zone->privatetype,
                                         np->data, sizeof(np->data));
                np->length = prdata.length;
+               np->nsec = ISC_FALSE;
        }
 
        zone_iattach(zone, &dummy);
index 2bf3e08a0fc373f4d41083d9d499dee412f8c46c..4c362053fbe791f76f4b2a4f688d3c30e9274312 100644 (file)
@@ -1448,6 +1448,9 @@ build_msghdr_send(isc__socket_t *sock, isc_socketevent_t *dev,
 #endif
 
        memset(msg, 0, sizeof(*msg));
+       if (sock->sendcmsgbuflen != 0U) {
+               memset(sock->sendcmsgbuf, 0, sock->sendcmsgbuflen);
+       }
 
        if (!sock->connected) {
                msg->msg_name = (void *)&dev->address.type.sa;
index af5183c6f7fcd34997ed43eaf09eb100ff9019fc..a3c9f2ff0faf8988150f27be7cf88fc2857b5025 100644 (file)
@@ -2626,6 +2626,8 @@ ns__client_request(isc_task_t *task, isc_event_t *event) {
                }
        }
 
+       isc_sockaddr_fromnetaddr(&client->destsockaddr, &client->destaddr, 0);
+
        if ((client->attributes & NS_CLIENTATTR_HAVEECS) != 0) {
                ecs = &client->ecs;
        }
@@ -3715,6 +3717,11 @@ ns_client_getsockaddr(ns_client_t *client) {
        return (&client->peeraddr);
 }
 
+isc_sockaddr_t *
+ns_client_getdestaddr(ns_client_t *client) {
+       return (&client->destsockaddr);
+}
+
 isc_result_t
 ns_client_checkaclsilent(ns_client_t *client, isc_netaddr_t *netaddr,
                         dns_acl_t *acl, isc_boolean_t default_allow)
index 9034910b1e6db859dd57ac8f440798cb6cde3ad1..83095e02dacdd456a0a437eed96427a63ed50467 100644 (file)
@@ -135,6 +135,7 @@ struct ns_client {
        isc_sockaddr_t          peeraddr;
        isc_boolean_t           peeraddr_valid;
        isc_netaddr_t           destaddr;
+       isc_sockaddr_t          destsockaddr;
 
        dns_ecs_t               ecs;   /*%< EDNS client subnet sent by client */
 
@@ -303,6 +304,13 @@ ns_client_getsockaddr(ns_client_t *client);
  * currently being processed.
  */
 
+isc_sockaddr_t *
+ns_client_getdestaddr(ns_client_t *client);
+/*%<
+ * Get the destination address (server) for the request that is
+ * currently being processed.
+ */
+
 isc_result_t
 ns_client_checkaclsilent(ns_client_t *client, isc_netaddr_t *netaddr,
                         dns_acl_t *acl, isc_boolean_t default_allow);
index 29084124c967f8fb97cb98dac300c5823e93caca..f9be05f59e8ba33bff84b3e5e21d1dbc8a98d04a 100644 (file)
@@ -80,7 +80,8 @@ ns_notify_start(ns_client_t *client) {
        if (result != ISC_R_SUCCESS) {
                notify_log(client, ISC_LOG_NOTICE,
                           "notify question section empty");
-               goto formerr;
+               result = DNS_R_FORMERR;
+               goto done;
        }
 
        /*
@@ -92,7 +93,8 @@ ns_notify_start(ns_client_t *client) {
        if (ISC_LIST_NEXT(zone_rdataset, link) != NULL) {
                notify_log(client, ISC_LOG_NOTICE,
                           "notify question section contains multiple RRs");
-               goto formerr;
+               result = DNS_R_FORMERR;
+               goto done;
        }
 
        /* The zone section must have exactly one name. */
@@ -100,14 +102,16 @@ ns_notify_start(ns_client_t *client) {
        if (result != ISC_R_NOMORE) {
                notify_log(client, ISC_LOG_NOTICE,
                           "notify question section contains multiple RRs");
-               goto formerr;
+               result = DNS_R_FORMERR;
+               goto done;
        }
 
        /* The one rdataset must be an SOA. */
        if (zone_rdataset->type != dns_rdatatype_soa) {
                notify_log(client, ISC_LOG_NOTICE,
                           "notify question section contains no SOA");
-               goto formerr;
+               result = DNS_R_FORMERR;
+               goto done;
        }
 
        tsigkey = dns_message_gettsigkey(request);
@@ -126,38 +130,33 @@ ns_notify_start(ns_client_t *client) {
                }
        } else
                tsigbuf[0] = '\0';
+
        dns_name_format(zonename, namebuf, sizeof(namebuf));
-       result = dns_zt_find(client->view->zonetable, zonename, 0, NULL,
-                            &zone);
-       if (result != ISC_R_SUCCESS)
-               goto notauth;
-
-       switch (dns_zone_gettype(zone)) {
-       case dns_zone_master:
-       case dns_zone_slave:
-       case dns_zone_stub:     /* Allow dialup passive to work. */
-               notify_log(client, ISC_LOG_INFO,
-                          "received notify for zone '%s'%s", namebuf, tsigbuf);
-               respond(client, dns_zone_notifyreceive(zone,
-                       ns_client_getsockaddr(client), request));
-               break;
-       default:
-               goto notauth;
+       result = dns_zt_find(client->view->zonetable, zonename, 0, NULL, &zone);
+       if (result == ISC_R_SUCCESS) {
+               dns_zonetype_t zonetype = dns_zone_gettype(zone);
+
+               if ((zonetype == dns_zone_master) ||
+                   (zonetype == dns_zone_slave) ||
+                   (zonetype == dns_zone_stub))
+               {
+                       isc_sockaddr_t *from = ns_client_getsockaddr(client);
+                       isc_sockaddr_t *to = ns_client_getdestaddr(client);
+                       notify_log(client, ISC_LOG_INFO,
+                                  "received notify for zone '%s'%s",
+                                  namebuf, tsigbuf);
+                       result = dns_zone_notifyreceive2(zone, from, to,
+                                                        request);
+                       goto done;
+               }
        }
-       dns_zone_detach(&zone);
-       return;
 
- notauth:
        notify_log(client, ISC_LOG_NOTICE,
                   "received notify for zone '%s'%s: not authoritative",
                   namebuf, tsigbuf);
        result = DNS_R_NOTAUTH;
-       goto failure;
-
- formerr:
-       result = DNS_R_FORMERR;
 
failure:
done:
        if (zone != NULL)
                dns_zone_detach(&zone);
        respond(client, result);
index 6fc52382e0178c8e08fab8b676ffc0c6e72fc0d9..196acd47ac78508986b35f71ef66726f4be69358 100644 (file)
@@ -18,6 +18,7 @@ ns_client_detach
 ns_client_dumprecursing
 ns_client_error
 ns_client_getsockaddr
+ns_client_getdestaddr
 ns_client_killoldestquery
 ns_client_log
 ns_client_logv