]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix for #367: fix memory leak when cannot bind to listening port.
authorGeorge Thessalonikefs <george@nlnetlabs.nl>
Mon, 22 Mar 2021 15:46:17 +0000 (16:46 +0100)
committerGeorge Thessalonikefs <george@nlnetlabs.nl>
Mon, 22 Mar 2021 15:46:17 +0000 (16:46 +0100)
doc/Changelog
services/listen_dnsport.c

index d83948982d6520232d236933bcbd8ba60da53726..67a53e8f44d6badfa35c9482dda390308a26bfef 100644 (file)
@@ -1,5 +1,6 @@
 22 March 2021: George
        - Fix unused-function warning when compiling with --enable-dnscrypt.
+       - Fix for #367: fix memory leak when cannot bind to listening port.
 
 22 March 2021: Wouter
        - Merge #449 from orbea: build: Add missing linker flags.
index b22beab6e8e013a9d86ed222f0d0a8f9896615db..81a7856eb042ac7b944d8c8e15530e1fd6ecbe2a 100644 (file)
@@ -1166,6 +1166,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1, 
                        &noip6, rcv, snd, reuseport, transparent,
                        tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock)) == -1) {
+                       freeaddrinfo(ub_sock->addr);
                        free(ub_sock);
                        if(noip6) {
                                log_warn("IPv6 protocol not available");
@@ -1176,12 +1177,14 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                /* getting source addr packet info is highly non-portable */
                if(!set_recvpktinfo(s, hints->ai_family)) {
                        sock_close(s);
+                       freeaddrinfo(ub_sock->addr);
                        free(ub_sock);
                        return 0;
                }
                if(!port_insert(list, s,
                   is_dnscrypt?listen_type_udpancil_dnscrypt:listen_type_udpancil, ub_sock)) {
                        sock_close(s);
+                       freeaddrinfo(ub_sock->addr);
                        free(ub_sock);
                        return 0;
                }
@@ -1193,6 +1196,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1, 
                        &noip6, rcv, snd, reuseport, transparent,
                        tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock)) == -1) {
+                       freeaddrinfo(ub_sock->addr);
                        free(ub_sock);
                        if(noip6) {
                                log_warn("IPv6 protocol not available");
@@ -1203,6 +1207,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                if(!port_insert(list, s,
                   is_dnscrypt?listen_type_udp_dnscrypt:listen_type_udp, ub_sock)) {
                        sock_close(s);
+                       freeaddrinfo(ub_sock->addr);
                        free(ub_sock);
                        return 0;
                }
@@ -1225,6 +1230,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                if((s = make_sock_port(SOCK_STREAM, ifname, port, hints, 1, 
                        &noip6, 0, 0, reuseport, transparent, tcp_mss, nodelay,
                        freebind, use_systemd, dscp, ub_sock)) == -1) {
+                       freeaddrinfo(ub_sock->addr);
                        free(ub_sock);
                        if(noip6) {
                                /*log_warn("IPv6 protocol not available");*/
@@ -1236,6 +1242,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                        verbose(VERB_ALGO, "setup TCP for SSL service");
                if(!port_insert(list, s, port_type, ub_sock)) {
                        sock_close(s);
+                       freeaddrinfo(ub_sock->addr);
                        free(ub_sock);
                        return 0;
                }