]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1466. [bug] lwresd configuration errors resulted in memory
authorMark Andrews <marka@isc.org>
Thu, 17 Apr 2003 06:39:33 +0000 (06:39 +0000)
committerMark Andrews <marka@isc.org>
Thu, 17 Apr 2003 06:39:33 +0000 (06:39 +0000)
                        and lock leaks.  [RT #5228]

CHANGES
bin/named/lwresd.c

diff --git a/CHANGES b/CHANGES
index 27853ea18ee00a3b701859a50129914d99d17a64..c4c09bae9f137851f5fb447d73b8509909fd9e9b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+1466.  [bug]           lwresd configuration errors resulted in memory
+                       and lock leaks.  [RT #5228]
+                       
 1465.  [bug]           isc_base64_decodestring() and isc_base64_tobuffer()
                        failed to check that trailing bits were zero allowing
                        some invalid base64 strings to be accepted.  [RT #5397]
index 2e4c6317b4837d63d2ab3d4e3d6f46cfd7f16ef3..753abade78fa1f7c32b035d2ff00e669458acaee 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: lwresd.c,v 1.43 2002/02/20 03:33:15 marka Exp $ */
+/* $Id: lwresd.c,v 1.44 2003/04/17 06:39:33 marka Exp $ */
 
 /*
  * Main program for the Lightweight Resolver Daemon.
@@ -450,7 +450,7 @@ ns_lwdmanager_detach(ns_lwresd_t **lwresdp) {
        lwresd->magic = 0;
        isc_mem_put(mctx, lwresd, sizeof(*lwresd));
        isc_mem_detach(&mctx);
-       lwresdp = NULL;
+       *lwresdp = NULL;
 }
 
 
@@ -495,7 +495,7 @@ ns_lwreslistener_detach(ns_lwreslistener_t **listenerp) {
        if (listener->manager != NULL)
                ns_lwdmanager_detach(&listener->manager);
 
-       if (listener->sock != 0)
+       if (listener->sock != NULL)
                isc_socket_detach(&listener->sock);
 
        listener->magic = 0;
@@ -563,18 +563,21 @@ listener_bind(ns_lwreslistener_t *listener, isc_sockaddr_t *address) {
        if (result != ISC_R_SUCCESS) {
                isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
                              NS_LOGMODULE_LWRESD, ISC_LOG_WARNING,
-                             "failed to create socket: %s",
+                             "failed to create lwres socket: %s",
                              isc_result_totext(result));
                return (result);
        }
 
        result = isc_socket_bind(sock, &listener->address);
        if (result != ISC_R_SUCCESS) {
+               char socktext[ISC_SOCKADDR_FORMATSIZE];
+               isc_sockaddr_format(&listener->address, socktext,
+                                   sizeof(socktext));
                isc_socket_detach(&sock);
                isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
                              NS_LOGMODULE_LWRESD, ISC_LOG_WARNING,
-                             "failed to bind socket: %s",
-                             isc_result_totext(result));
+                             "failed to add lwres socket: %s: %s",
+                             socktext, isc_result_totext(result));
                return (result);
        }
        listener->sock = sock;
@@ -704,8 +707,10 @@ configure_listener(isc_sockaddr_t *address, ns_lwresd_t *lwresd,
         */
        if (oldlistener == NULL) {
                result = listener_bind(listener, address);
-               if (result != ISC_R_SUCCESS)
-                       return (result);
+               if (result != ISC_R_SUCCESS) {
+                       ns_lwreslistener_detach(&listener);
+                       return (ISC_R_SUCCESS);
+               }
        } else
                listener_copysock(oldlistener, listener);
 
@@ -717,7 +722,7 @@ configure_listener(isc_sockaddr_t *address, ns_lwresd_t *lwresd,
                              "lwres: failed to start %s: %s", socktext,
                              isc_result_totext(result));
                ns_lwreslistener_detach(&listener);
-               return (result);
+               return (ISC_R_SUCCESS);
        }
 
        if (oldlistener != NULL) {
@@ -748,6 +753,9 @@ ns_lwresd_configure(isc_mem_t *mctx, cfg_obj_t *config) {
        ns_lwreslistenerlist_t newlisteners;
        isc_result_t result;
        char socktext[ISC_SOCKADDR_FORMATSIZE];
+       isc_sockaddr_t *addrs = NULL;
+       ns_lwresd_t *lwresd = NULL;
+       isc_uint32_t count = 0;
 
        REQUIRE(mctx != NULL);
        REQUIRE(config != NULL);
@@ -773,16 +781,10 @@ ns_lwresd_configure(isc_mem_t *mctx, cfg_obj_t *config) {
             element != NULL;
             element = cfg_list_next(element))
        {
-               ns_lwresd_t *lwresd;
                in_port_t port;
-               isc_sockaddr_t *addrs = NULL;
-               isc_uint32_t count;
 
                lwres = cfg_listelt_value(element);
-               lwresd = NULL;
-               result = ns_lwdmanager_create(mctx, lwres, &lwresd);
-               if (result != ISC_R_SUCCESS)
-                       return (result);
+               CHECK(ns_lwdmanager_create(mctx, lwres, &lwresd));
 
                port = lwresd_g_listenport;
                if (port == 0)
@@ -796,33 +798,19 @@ ns_lwresd_configure(isc_mem_t *mctx, cfg_obj_t *config) {
 
                        localhost.s_addr = htonl(INADDR_LOOPBACK);
                        isc_sockaddr_fromin(&address, &localhost, port);
-                       result = configure_listener(&address, lwresd,
-                                                   mctx, &newlisteners);
+                       CHECK(configure_listener(&address, lwresd, mctx,
+                                                &newlisteners));
                } else {
                        isc_uint32_t i;
 
-                       result = ns_config_getiplist(config, listenerslist,
-                                                    port, mctx,
-                                                    &addrs, &count);
-                       if (result != ISC_R_SUCCESS)
-                               goto failure;
-                       
-                       for (i = 0; i < count; i++) {
-                               result = configure_listener(&addrs[i], lwresd,
-                                                           mctx,
-                                                           &newlisteners);
-                               if (result != ISC_R_SUCCESS)
-                                       goto failure;
-                       }
-               }
-
-       failure:
-               if (addrs != NULL)
+                       CHECK(ns_config_getiplist(config, listenerslist,
+                                                 port, mctx, &addrs, &count));
+                       for (i = 0; i < count; i++)
+                               CHECK(configure_listener(&addrs[i], lwresd,
+                                                        mctx, &newlisteners));
                        ns_config_putiplist(mctx, &addrs, count);
-
+               }
                ns_lwdmanager_detach(&lwresd);
-               if (result != ISC_R_SUCCESS)
-                       return (result);
        }
 
        /*
@@ -841,13 +829,20 @@ ns_lwresd_configure(isc_mem_t *mctx, cfg_obj_t *config) {
                isc_log_write(ns_g_lctx, ISC_LOGCATEGORY_GENERAL,
                              NS_LOGMODULE_LWRESD, ISC_LOG_NOTICE,
                              "lwres no longer listening on %s", socktext);
-
        }
+
+ cleanup:
        ISC_LIST_APPENDLIST(listeners, newlisteners, link);
 
+       if (addrs != NULL)
+               ns_config_putiplist(mctx, &addrs, count);
+
+       if (lwresd != NULL)
+               ns_lwdmanager_detach(&lwresd);
+
        UNLOCK(&listeners_lock);
 
-       return (ISC_R_SUCCESS);
+       return (result);
 }
 
 void