aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog106
-rw-r--r--Makerules3
-rw-r--r--crypt/md5-crypt.c11
-rw-r--r--elf/dl-close.c45
-rw-r--r--elf/dl-libc.c4
-rw-r--r--grp/fgetgrent.c14
-rw-r--r--iconv/gconv_cache.c5
-rw-r--r--iconv/gconv_conf.c5
-rw-r--r--iconv/gconv_db.c5
-rw-r--r--iconv/gconv_dl.c4
-rw-r--r--include/libc-symbols.h27
-rw-r--r--inet/getnetgrent.c18
-rw-r--r--inet/rcmd.c20
-rw-r--r--inet/rexec.c14
-rw-r--r--intl/dcigettext.c5
-rw-r--r--intl/finddomain.c5
-rw-r--r--intl/localealias.c21
-rw-r--r--locale/loadarchive.c2
-rw-r--r--locale/setlocale.c4
-rw-r--r--login/getutent.c15
-rw-r--r--login/getutid.c15
-rw-r--r--login/getutline.c14
-rw-r--r--malloc/mtrace.c11
-rw-r--r--malloc/obstack.c5
-rw-r--r--malloc/set-freeres.c10
-rw-r--r--misc/efgcvt.c14
-rw-r--r--misc/fstab.c6
-rw-r--r--misc/mntent.c16
-rw-r--r--nss/getXXbyYY.c12
-rw-r--r--nss/getXXent.c12
-rw-r--r--nss/nsswitch.c5
-rw-r--r--posix/regcomp.c4
-rw-r--r--pwd/fgetpwent.c14
-rw-r--r--resolv/gai_misc.c5
-rw-r--r--resolv/ns_print.c4
-rw-r--r--resolv/nsap_addr.c2
-rw-r--r--resolv/res_hconf.c13
-rw-r--r--shadow/fgetspent.c14
-rw-r--r--stdio-common/printf-parse.h4
-rw-r--r--stdio-common/reg-printf.c19
-rw-r--r--stdlib/fmtmsg.c4
-rw-r--r--string/strerror.c20
-rw-r--r--sunrpc/clnt_perr.c5
-rw-r--r--sysdeps/generic/setenv.c5
-rw-r--r--sysdeps/posix/ttyname.c12
-rw-r--r--sysdeps/pthread/aio_misc.c7
-rw-r--r--sysdeps/unix/sysv/linux/getsysstats.c10
-rw-r--r--sysdeps/unix/sysv/linux/shm_open.c10
-rw-r--r--sysdeps/unix/sysv/linux/ttyname.c13
-rw-r--r--time/tzfile.c13
-rw-r--r--time/tzset.c4
51 files changed, 337 insertions, 298 deletions
diff --git a/ChangeLog b/ChangeLog
index 271e451301..8226c644e2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,109 @@
+2002-10-30 Jakub Jelinek <jakub@redhat.com>
+
+ * include/libc-symbols.h (__libc_freeres_fn_section, libc_freeres_fn):
+ New macros.
+ * elf/dl-close.c (free_mem): Use libc_freeres_fn macro, remove
+ text_set_element.
+ * elf/dl-libc.c (free_mem): Likewise.
+ * iconv/gconv_conf.c (free_mem): Likewise.
+ * iconv/gconv_db.c (free_mem): Likewise.
+ * iconv/gconv_dl.c (free_mem): Likewise.
+ * iconv/gconv_cache.c (free_mem): Likewise.
+ * intl/finddomain.c (free_mem): Likewise.
+ * intl/dcigettext.c (free_mem): Likewise.
+ * locale/setlocale.c (free_mem): Likewise.
+ * misc/fstab.c (fstab_free): Likewise.
+ * nss/nsswitch.c (free_mem): Likewise.
+ * posix/regcomp.c (free_mem): Likewise.
+ * resolv/gai_misc.c (free_res): Likewise.
+ * stdlib/fmtmsg.c (free_mem): Likewise.
+ * sunrpc/clnt_perr.c (free_mem): Likewise.
+ * sysdeps/generic/setenv.c (free_mem): Likewise.
+ * sysdeps/unix/sysv/linux/shm_open.c (freeit): Likewise.
+ * sysdeps/pthread/aio_misc.c (free_res): Likewise.
+ * time/tzset.c (free_mem): Likewise.
+ * malloc/mtrace.c (release_libc_mem): Add __libc_freeres_fn_section.
+ * locale/loadarchive.c (_nl_archive_subfreeres): Likewise.
+ * malloc/set-freeres.c (__libc_freeres): Likewise.
+
+ * login/getutent.c: Include stdlib.h instead of stddef.h.
+ (buffer): Change into pointer to utmp, add libc_freeres_ptr.
+ (__getutent): Allocate buffer the first time it is run.
+ * login/getutid.c: Include stdlib.h instead of stddef.h.
+ (buffer): Change into pointer to utmp, add libc_freeres_ptr.
+ (__getutid): Allocate buffer the first time it is run.
+ * login/getutline.c: Include stdlib.h instead of stddef.h.
+ (buffer): Change into pointer to utmp, add libc_freeres_ptr.
+ (__getutline): Allocate buffer the first time it is run.
+ * malloc/mtrace.c (malloc_trace_buffer): Change into char *.
+ (mtrace): Allocate malloc_trace_buffer.
+ * resolv/nsap_addr.c (inet_nsap_ntoa): Decrease size of tmpbuf.
+ * resolv/ns_print.c (ns_sprintrrf): Decrease size of t.
+ * string/strerror.c: Include libintl.h and errno.h.
+ (buf): New variable.
+ (strerror): Only allocate buffer if actually needed (unknown error).
+ * time/tzfile.c (transitions): Add libc_freeres_ptr.
+ (freeres): Remove.
+
+2002-10-25 Jakub Jelinek <jakub@redhat.com>
+
+ * include/libc-symbols.h (libc_freeres_ptr): New macro.
+ * malloc/set-freeres.c (__libc_freeres_ptrs): Define using
+ symbol_set_define.
+ (__libc_freeres): Free all pointers in that section.
+ * Makerules (build-shlib): Add $(LDSEDCMD-$(@F:lib%.so=%).so) to sed
+ commands when creating .lds script.
+ (LDSEDCMD-c.so): New variable.
+ * inet/rcmd.c (ahostbuf): Change into char *. Add libc_freeres_ptr.
+ (rcmd_af): Use strdup to allocate ahostbuf.
+ * inet/rexec.c (ahostbuf): Change into char *. Add libc_freeres_ptr.
+ (rexec_af): Use strdup to allocate ahostbuf.
+ * stdio-common/reg-printf.c (printf_funcs): Remove.
+ (__printf_arginfo_table): Change into printf_arginfo_function **.
+ Add libc_freeres_ptr.
+ (__register_printf_function): Allocate __printf_arginfo_table
+ and __printf_function_table the first time it is called.
+ * stdio-common/printf-parse.h (__printf_arginfo_table): Change into
+ printf_arginfo_function **.
+ (parse_one_spec): Add __builtin_expect.
+ * grp/fgetgrent.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * inet/getnetgrent.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * intl/localealias.c (libc_freeres_ptr): Define if !_LIBC.
+ (string_space, map): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * misc/efgcvt.c (FCVT_BUFPTR): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * misc/mntent.c (getmntent_buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * crypt/md5-crypt.c (libc_freeres_ptr): Define if !_LIBC.
+ (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove for _LIBC.
+ * nss/getXXbyYY.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * nss/getXXent.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * pwd/fgetpwent.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * resolv/res_hconf.c (ifaddrs): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * shadow/fgetspent.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * sysdeps/posix/ttyname.c (getttyname_name): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * sysdeps/unix/sysv/linux/getsysstats.c (mount_proc): Add
+ libc_freeres_ptr.
+ (free_mem): Remove.
+ * sysdeps/unix/sysv/linux/ttyname.c (getttyname_name, ttyname_buf): Add
+ libc_freeres_ptr.
+ (free_mem): Remove.
+
+2002-10-30 Jakub Jelinek <jakub@redhat.com>
+
+ * malloc/obstack.c [_LIBC] (obstack_free): Change into strong_alias
+ instead of duplicating the whole function in libc.
+
2002-10-31 Roland McGrath <roland@redhat.com>
* sysdeps/i386/bits/byteswap.h [__GNUC__ < 2] (__bswap_32):
diff --git a/Makerules b/Makerules
index d66feb5b75..071352db51 100644
--- a/Makerules
+++ b/Makerules
@@ -447,7 +447,7 @@ $(build-shlib-helper) \
$(LDLIBS-$(@F:lib%.so=%).so) 2>&1 | \
sed -e '/^=========/,/^=========/!d;/^=========/d' \
-e 's/^.*\.hash[ ]*:.*$$/ .note.ABI-tag : { *(.note.ABI-tag) } &/' \
- > $@.lds
+ $(LDSEDCMD-$(@F:lib%.so=%).so) > $@.lds
rm -f $@.new
$(build-shlib-helper) -o $@ -T $@.lds \
$(csu-objpfx)abi-note.o $(build-shlib-objlist)
@@ -548,6 +548,7 @@ ifeq ($(elf),yes)
$(common-objpfx)libc_pic.os: $(common-objpfx)libc_pic.a
$(LINK.o) -nostdlib -nostartfiles -r -o $@ \
$(LDFLAGS-c_pic.os) -Wl,-d -Wl,--whole-archive $^
+LDSEDCMD-c.so = -e 's/^.*\*(\.dynbss).*$$/& __start___libc_freeres_ptrs = .; *(__libc_freeres_ptrs) __stop___libc_freeres_ptrs = .;/'
# Use our own special initializer and finalizer files for libc.so.
$(common-objpfx)libc.so: $(elfobjdir)/soinit.os \
$(common-objpfx)libc_pic.os \
diff --git a/crypt/md5-crypt.c b/crypt/md5-crypt.c
index 0f7f3ecce3..8cd23e3fa6 100644
--- a/crypt/md5-crypt.c
+++ b/crypt/md5-crypt.c
@@ -1,5 +1,5 @@
/* One way encryption based on MD5 sum.
- Copyright (C) 1996, 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1996,1997,1999,2000,2001,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -233,8 +233,10 @@ __md5_crypt_r (key, salt, buffer, buflen)
return buffer;
}
-
-static char *buffer;
+#ifndef _LIBC
+# define libc_freeres_ptr(decl) decl
+#endif
+libc_freeres_ptr (static char *buffer);
char *
__md5_crypt (const char *key, const char *salt)
@@ -261,10 +263,11 @@ __md5_crypt (const char *key, const char *salt)
return __md5_crypt_r (key, salt, buffer, buflen);
}
-
+#ifndef _LIBC
static void
__attribute__ ((__destructor__))
free_mem (void)
{
free (buffer);
}
+#endif
diff --git a/elf/dl-close.c b/elf/dl-close.c
index 094db533dd..632f8ba9fc 100644
--- a/elf/dl-close.c
+++ b/elf/dl-close.c
@@ -247,6 +247,11 @@ _dl_close (void *_map)
_r_debug.r_state = RT_DELETE;
_dl_debug_state ();
+#ifdef USE_TLS
+ size_t tls_free_start, tls_free_end;
+ tls_free_start = tls_free_end = GL(dl_tls_static_used);
+#endif
+
/* Check each element of the search list to see if all references to
it are gone. */
for (i = 0; list[i] != NULL; ++i)
@@ -286,6 +291,30 @@ _dl_close (void *_map)
imap->l_init_called))
/* All dynamically loaded modules with TLS are unloaded. */
GL(dl_tls_max_dtv_idx) = GL(dl_tls_static_nelem);
+
+ if (imap->l_tls_offset != 0)
+ {
+ /* Collect a contiguous chunk built from the objects in
+ this search list, going in either direction. When the
+ whole chunk is at the end of the used area then we can
+ reclaim it. */
+ if (imap->l_tls_offset == tls_free_end)
+ /* Extend the contiguous chunk being reclaimed. */
+ tls_free_end += imap->l_tls_blocksize;
+ else if (imap->l_tls_offset + imap->l_tls_blocksize
+ == tls_free_start)
+ /* Extend the chunk backwards. */
+ tls_free_start = imap->l_tls_offset;
+ else
+ {
+ /* This isn't contiguous with the last chunk freed.
+ One of them will be leaked. */
+ if (tls_free_end == GL(dl_tls_static_used))
+ GL(dl_tls_static_used) = tls_free_start;
+ tls_free_start = imap->l_tls_offset;
+ tls_free_end = tls_free_start + imap->l_tls_blocksize;
+ }
+ }
}
#endif
@@ -363,11 +392,15 @@ _dl_close (void *_map)
}
#ifdef USE_TLS
- /* If we removed any object which uses TLS bumnp the generation
- counter. */
+ /* If we removed any object which uses TLS bump the generation counter. */
if (any_tls)
- if (__builtin_expect (++GL(dl_tls_generation) == 0, 0))
- __libc_fatal (_("TLS generation counter wrapped! Please send report with the 'glibcbug' script."));
+ {
+ if (__builtin_expect (++GL(dl_tls_generation) == 0, 0))
+ __libc_fatal (_("TLS generation counter wrapped! Please send report with the 'glibcbug' script."));
+
+ if (tls_free_end == GL(dl_tls_static_used))
+ GL(dl_tls_static_used) = tls_free_start;
+ }
#endif
/* Notify the debugger those objects are finalized and gone. */
@@ -424,8 +457,7 @@ free_slotinfo (struct dtv_slotinfo_list *elemp)
#endif
-static void
-free_mem (void)
+libc_freeres_fn (free_mem)
{
if (__builtin_expect (GL(dl_global_scope_alloc), 0) != 0
&& GL(dl_main_searchlist)->r_nlist == GL(dl_initial_searchlist).r_nlist)
@@ -453,4 +485,3 @@ free_mem (void)
GL(dl_tls_dtv_slotinfo_list)->next = NULL;
#endif
}
-text_set_element (__libc_subfreeres, free_mem);
diff --git a/elf/dl-libc.c b/elf/dl-libc.c
index 938b5d707d..d69e49f359 100644
--- a/elf/dl-libc.c
+++ b/elf/dl-libc.c
@@ -123,8 +123,7 @@ __libc_dlclose (void *__map)
}
-static void
-free_mem (void)
+libc_freeres_fn (free_mem)
{
struct link_map *l;
struct r_search_path_elem *d;
@@ -154,4 +153,3 @@ free_mem (void)
}
}
}
-text_set_element (__libc_subfreeres, free_mem);
diff --git a/grp/fgetgrent.c b/grp/fgetgrent.c
index a004aabdf1..684018c429 100644
--- a/grp/fgetgrent.c
+++ b/grp/fgetgrent.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1996,1997,1999,2000,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -26,7 +26,7 @@
/* We need to protect the dynamic buffer handling. */
__libc_lock_define_initialized (static, lock);
-static char *buffer;
+libc_freeres_ptr (static char *buffer);
/* Read one entry from the given stream. */
struct group *
@@ -83,13 +83,3 @@ fgetgrent (FILE *stream)
return result;
}
-
-
-/* Free all resources if necessary. */
-static void __attribute__ ((unused))
-free_mem (void)
-{
- free (buffer);
-}
-
-text_set_element (__libc_subfreeres, free_mem);
diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c
index f7dca0285a..8f92cbaf67 100644
--- a/iconv/gconv_cache.c
+++ b/iconv/gconv_cache.c
@@ -445,8 +445,7 @@ __gconv_release_cache (struct __gconv_step *steps, size_t nsteps)
/* Free all resources if necessary. */
-static void __attribute__ ((unused))
-free_mem (void)
+libc_freeres_fn (free_mem)
{
if (cache_malloced)
free (gconv_cache);
@@ -455,5 +454,3 @@ free_mem (void)
__munmap (gconv_cache, cache_size);
#endif
}
-
-text_set_element (__libc_subfreeres, free_mem);
diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c
index 8c2f4b014e..cd5055c303 100644
--- a/iconv/gconv_conf.c
+++ b/