diff options
Diffstat (limited to 'resolv')
-rw-r--r-- | resolv/gai_misc.c | 6 | ||||
-rw-r--r-- | resolv/res-close.c | 2 | ||||
-rw-r--r-- | resolv/res_hconf.c | 16 | ||||
-rw-r--r-- | resolv/resolv-internal.h | 14 | ||||
-rw-r--r-- | resolv/resolv_conf.c | 3 | ||||
-rw-r--r-- | resolv/tst-leaks2.c | 2 |
6 files changed, 26 insertions, 17 deletions
diff --git a/resolv/gai_misc.c b/resolv/gai_misc.c index dda9b47f00..9e3b1d29b7 100644 --- a/resolv/gai_misc.c +++ b/resolv/gai_misc.c @@ -434,7 +434,11 @@ handle_requests (void *arg) /* Free allocated resources. */ -libc_freeres_fn (free_res) +#if !PTHREAD_IN_LIBC +__attribute__ ((__destructor__)) static +#endif +void +__gai_freemem (void) { size_t row; diff --git a/resolv/res-close.c b/resolv/res-close.c index 936fd3d1dd..8d546777c7 100644 --- a/resolv/res-close.c +++ b/resolv/res-close.c @@ -140,5 +140,3 @@ __res_thread_freeres (void) /* Make sure we do a full re-initialization the next time. */ _res.options = 0; } -/* Also must be called when the main thread exits. */ -text_set_element (__libc_subfreeres, __res_thread_freeres); diff --git a/resolv/res_hconf.c b/resolv/res_hconf.c index 2c4e12b6cd..89bd20be38 100644 --- a/resolv/res_hconf.c +++ b/resolv/res_hconf.c @@ -42,6 +42,7 @@ #include "res_hconf.h" #include <wchar.h> #include <atomic.h> +#include <set-freeres.h> #if IS_IN (libc) # define fgets_unlocked __fgets_unlocked @@ -330,19 +331,8 @@ _res_hconf_init (void) #if IS_IN (libc) # if defined SIOCGIFCONF && defined SIOCGIFNETMASK /* List of known interfaces. */ -libc_freeres_ptr ( -static struct netaddr -{ - int addrtype; - union - { - struct - { - uint32_t addr; - uint32_t mask; - } ipv4; - } u; -} *ifaddrs); +static struct netaddr *ifaddrs; +weak_alias (ifaddrs, __libc_resolv_res_hconf_freemem_ptr) # endif /* Reorder addresses returned in a hostent such that the first address diff --git a/resolv/resolv-internal.h b/resolv/resolv-internal.h index 97812ebf6c..c55f3c0366 100644 --- a/resolv/resolv-internal.h +++ b/resolv/resolv-internal.h @@ -34,6 +34,20 @@ loads and stores. */ typedef HEADER __attribute__ ((__aligned__(1))) UHEADER; +/* List of known interfaces. */ +struct netaddr +{ + int addrtype; + union + { + struct + { + uint32_t addr; + uint32_t mask; + } ipv4; + } u; +}; + /* Legacy function. This needs to be removed once all NSS modules have been adjusted. */ static inline bool diff --git a/resolv/resolv_conf.c b/resolv/resolv_conf.c index 2e561c8959..0ef66d49d3 100644 --- a/resolv/resolv_conf.c +++ b/resolv/resolv_conf.c @@ -654,7 +654,8 @@ __resolv_conf_detach (struct __res_state *resp) } /* Deallocate the global data. */ -libc_freeres_fn (freeres) +void +__libc_resolv_conf_freemem (void) { /* No locking because this function is supposed to be called when the process has turned single-threaded. */ diff --git a/resolv/tst-leaks2.c b/resolv/tst-leaks2.c index 3851ea06ce..50a8054546 100644 --- a/resolv/tst-leaks2.c +++ b/resolv/tst-leaks2.c @@ -23,6 +23,8 @@ #include <resolv.h> #include <support/check.h> +void __libc_freeres (void); + static int do_test (void) { |