mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
* 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.
This commit is contained in:
parent
aa9937f78c
commit
c877418f2e
106
ChangeLog
106
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):
|
||||
|
@ -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 \
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -597,11 +597,8 @@ __gconv_read_conf (void)
|
||||
|
||||
|
||||
/* Free all resources if necessary. */
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
if (__gconv_path_elem != NULL && __gconv_path_elem != &empty_path_elem)
|
||||
free ((void *) __gconv_path_elem);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -778,8 +778,7 @@ free_modules_db (struct gconv_module *node)
|
||||
|
||||
|
||||
/* Free all resources if necessary. */
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
if (__gconv_alias_db != NULL)
|
||||
__tdestroy (__gconv_alias_db, free);
|
||||
@ -790,5 +789,3 @@ free_mem (void)
|
||||
if (known_derivations != NULL)
|
||||
__tdestroy (known_derivations, free_derivation);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -203,12 +203,10 @@ do_release_all (void *nodep)
|
||||
free (obj);
|
||||
}
|
||||
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
__tdestroy (loaded, do_release_all);
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -253,17 +253,20 @@
|
||||
/* Tacking on "\n\t#" to the section name makes gcc put it's bogus
|
||||
section attributes on what looks like a comment to the assembler. */
|
||||
# ifdef HAVE_SECTION_QUOTES
|
||||
# define link_warning(symbol, msg) \
|
||||
__make_section_unallocated (".gnu.warning." #symbol) \
|
||||
static const char __evoke_link_warning_##symbol[] \
|
||||
__attribute__ ((unused, section (".gnu.warning." #symbol "\"\n\t#\""))) \
|
||||
= msg;
|
||||
# define __sec_comment "\"\n\t#\""
|
||||
# else
|
||||
# define link_warning(symbol, msg) \
|
||||
# define __sec_comment "\n\t#"
|
||||
# endif
|
||||
# define link_warning(symbol, msg) \
|
||||
__make_section_unallocated (".gnu.warning." #symbol) \
|
||||
static const char __evoke_link_warning_##symbol[] \
|
||||
__attribute__ ((unused, section (".gnu.warning." #symbol "\n\t#"))) = msg;
|
||||
# endif
|
||||
__attribute__ ((unused, section (".gnu.warning." #symbol __sec_comment))) \
|
||||
= msg;
|
||||
# define libc_freeres_ptr(decl) \
|
||||
__make_section_unallocated ("__libc_freeres_ptrs, \"aw\", @nobits") \
|
||||
decl __attribute__ ((section ("__libc_freeres_ptrs" __sec_comment)))
|
||||
# define __libc_freeres_fn_section \
|
||||
__attribute__ ((section ("__libc_freeres_fn")))
|
||||
# else /* Not ELF: a.out */
|
||||
# ifdef HAVE_XCOFF
|
||||
/* XCOFF does not support .stabs.
|
||||
@ -276,11 +279,19 @@
|
||||
asm (".stabs \"" msg "\",30,0,0,0\n\t" \
|
||||
".stabs \"" __SYMBOL_PREFIX #symbol "\",1,0,0,0\n");
|
||||
# endif /* XCOFF */
|
||||
# define libc_freeres_ptr(decl) decl
|
||||
# define __libc_freeres_fn_section
|
||||
# endif
|
||||
#else
|
||||
/* We will never be heard; they will all die horribly. */
|
||||
# define link_warning(symbol, msg)
|
||||
# define libc_freeres_ptr(decl) decl
|
||||
# define __libc_freeres_fn_section
|
||||
#endif
|
||||
#define libc_freeres_fn(name) \
|
||||
static void name (void) __attribute_used__ __libc_freeres_fn_section; \
|
||||
text_set_element (__libc_subfreeres, name); \
|
||||
static void name (void)
|
||||
|
||||
/* A canned warning for sysdeps/stub functions. */
|
||||
#define stub_warning(name) \
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 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
|
||||
@ -21,8 +21,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <bits/libc-lock.h>
|
||||
|
||||
/* Statis buffer for return value. We allocate it when needed. */
|
||||
static char *buffer;
|
||||
/* Static buffer for return value. We allocate it when needed. */
|
||||
libc_freeres_ptr (static char *buffer);
|
||||
/* All three strings should fit in a block of 1kB size. */
|
||||
#define BUFSIZE 1024
|
||||
|
||||
@ -48,15 +48,3 @@ getnetgrent (char **hostp, char **userp, char **domainp)
|
||||
|
||||
return __getnetgrent_r (hostp, userp, domainp, buffer, BUFSIZE);
|
||||
}
|
||||
|
||||
|
||||
/* Make sure the memory is freed if the programs ends while in
|
||||
memory-debugging mode and something actually was allocated. */
|
||||
static void
|
||||
__attribute__ ((unused))
|
||||
free_mem (void)
|
||||
{
|
||||
free (buffer);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
20
inet/rcmd.c
20
inet/rcmd.c
@ -101,7 +101,7 @@ int iruserok (u_int32_t raddr, int superuser, const char *ruser,
|
||||
|
||||
libc_hidden_proto (iruserok_af)
|
||||
|
||||
static char ahostbuf[NI_MAXHOST];
|
||||
libc_freeres_ptr(static char *ahostbuf);
|
||||
|
||||
int
|
||||
rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af)
|
||||
@ -153,11 +153,21 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af)
|
||||
pfd[1].events = POLLIN;
|
||||
|
||||
if (res->ai_canonname){
|
||||
strncpy(ahostbuf, res->ai_canonname, sizeof(ahostbuf));
|
||||
ahostbuf[sizeof(ahostbuf)-1] = '\0';
|
||||
free (ahostbuf);
|
||||
ahostbuf = strdup (res->ai_canonname);
|
||||
if (ahostbuf == NULL) {
|
||||
#ifdef USE_IN_LIBIO
|
||||
if (_IO_fwide (stderr, 0) > 0)
|
||||
__fwprintf(stderr, L"%s",
|
||||
_("rcmd: Cannot allocate memory\n"));
|
||||
else
|
||||
#endif
|
||||
fputs(_("rcmd: Cannot allocate memory\n"),
|
||||
stderr);
|
||||
return (-1);
|
||||
}
|
||||
*ahost = ahostbuf;
|
||||
}
|
||||
else
|
||||
} else
|
||||
*ahost = NULL;
|
||||
ai = res;
|
||||
refused = 0;
|
||||
|
14
inet/rexec.c
14
inet/rexec.c
@ -45,7 +45,7 @@ static char sccsid[] = "@(#)rexec.c 8.1 (Berkeley) 6/4/93";
|
||||
#include <unistd.h>
|
||||
|
||||
int rexecoptions;
|
||||
static char ahostbuf[NI_MAXHOST];
|
||||
libc_freeres_ptr (static char *ahostbuf);
|
||||
|
||||
int
|
||||
rexec_af(ahost, rport, name, pass, cmd, fd2p, af)
|
||||
@ -79,13 +79,15 @@ rexec_af(ahost, rport, name, pass, cmd, fd2p, af)
|
||||
}
|
||||
|
||||
if (res0->ai_canonname){
|
||||
strncpy(ahostbuf, res0->ai_canonname, sizeof(ahostbuf));
|
||||
ahostbuf[sizeof(ahostbuf)-1] = '\0';
|
||||
free (ahostbuf);
|
||||
ahostbuf = strdup (res0->ai_canonname);
|
||||
if (ahostbuf == NULL) {
|
||||
perror ("rexec: strdup");
|
||||
return (-1);
|
||||
}
|
||||
*ahost = ahostbuf;
|
||||
}
|
||||
else{
|
||||
} else
|
||||
*ahost = NULL;
|
||||
}
|
||||
ruserpass(res0->ai_canonname, &name, &pass);
|
||||
retry:
|
||||
s = __socket(res0->ai_family, res0->ai_socktype, 0);
|
||||
|
@ -1124,8 +1124,7 @@ mempcpy (dest, src, n)
|
||||
#ifdef _LIBC
|
||||
/* If we want to free all resources we have to do some work at
|
||||
program's end. */
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
void *old;
|
||||
|
||||
@ -1155,6 +1154,4 @@ free_mem (void)
|
||||
free (old);
|
||||
}
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
#endif
|
||||
|
@ -168,8 +168,7 @@ _nl_find_domain (dirname, locale, domainname, domainbinding)
|
||||
|
||||
|
||||
#ifdef _LIBC
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
struct loaded_l10nfile *runp = _nl_loaded_domains;
|
||||
|
||||
@ -183,6 +182,4 @@ free_mem (void)
|
||||
free (here);
|
||||
}
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
#endif
|
||||
|
@ -117,10 +117,14 @@ struct alias_map
|
||||
};
|
||||
|
||||
|
||||
static char *string_space;
|
||||
#ifndef _LIBC
|
||||
# define libc_freeres_ptr(decl) decl
|
||||
#endif
|
||||
|
||||
libc_freeres_ptr (static char *string_space);
|
||||
static size_t string_space_act;
|
||||
static size_t string_space_max;
|
||||
static struct alias_map *map;
|
||||
libc_freeres_ptr (static struct alias_map *map);
|
||||
static size_t nmap;
|
||||
static size_t maxmap;
|
||||
|
||||
@ -371,19 +375,6 @@ extend_alias_table ()
|
||||
}
|
||||
|
||||
|
||||
#ifdef _LIBC
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
{
|
||||
if (string_space != NULL)
|
||||
free (string_space);
|
||||
if (map != NULL)
|
||||
free (map);
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
#endif
|
||||
|
||||
|
||||
static int
|
||||
alias_compare (map1, map2)
|
||||
const struct alias_map *map1;
|
||||
|
@ -493,7 +493,7 @@ _nl_load_locale_from_archive (int category, const char **namep)
|
||||
return lia->data[category];
|
||||
}
|
||||
|
||||
void
|
||||
void __libc_freeres_fn_section
|
||||
_nl_archive_subfreeres (void)
|
||||
{
|
||||
struct locale_in_archive *lia;
|
||||
|
@ -463,8 +463,7 @@ free_category (int category,
|
||||
}
|
||||
}
|
||||
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
#ifdef NL_CURRENT_INDIRECT
|
||||
/* We don't use the loop because we want to have individual weak
|
||||
@ -494,4 +493,3 @@ free_mem (void)
|
||||
not called _nl_unload_locale on them above. */
|
||||
_nl_archive_subfreeres ();
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 1998, 2001, 2002 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
@ -17,12 +17,12 @@
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <stddef.h> /* For NULL. */
|
||||
#include <stdlib.h>
|
||||
#include <utmp.h>
|
||||
|
||||
|
||||
/* Local buffer to store the result. */
|
||||
static struct utmp buffer;
|
||||
libc_freeres_ptr (static struct utmp *buffer);
|
||||
|
||||
|
||||
struct utmp *
|
||||
@ -30,7 +30,14 @@ __getutent (void)
|
||||
{
|
||||
struct utmp *result;
|
||||
|
||||
if (__getutent_r (&buffer, &result) < 0)
|
||||
if (buffer == NULL)
|
||||
{
|
||||
buffer = (struct utmp *) malloc (sizeof (struct utmp));
|
||||
if (buffer == NULL)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (__getutent_r (buffer, &result) < 0)
|
||||
return NULL;
|
||||
|
||||
return result;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 1998, 2001, 2002 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
@ -17,20 +17,25 @@
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <stddef.h> /* For NULL. */
|
||||
#include <stdlib.h>
|
||||
#include <utmp.h>
|
||||
|
||||
|
||||
/* Local buffer to store the result. */
|
||||
static struct utmp buffer;
|
||||
|
||||
libc_freeres_ptr (static struct utmp *buffer);
|
||||
|
||||
struct utmp *
|
||||
__getutid (const struct utmp *id)
|
||||
{
|
||||
struct utmp *result;
|
||||
|
||||
if (__getutid_r (id, &buffer, &result) < 0)
|
||||
if (buffer == NULL)
|
||||
{
|
||||
buffer = (struct utmp *) malloc (sizeof (struct utmp));
|
||||
if (buffer == NULL)
|
||||
return NULL;
|
||||
}
|
||||
if (__getutid_r (id, buffer, &result) < 0)
|
||||
return NULL;
|
||||
|
||||
return result;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 1998, 2001, 2002 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
@ -17,12 +17,12 @@
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <stddef.h> /* For NULL. */
|
||||
#include <stdlib.h>
|
||||
#include <utmp.h>
|
||||
|
||||
|
||||
/* Local buffer to store the result. */
|
||||
static struct utmp buffer;
|
||||
libc_freeres_ptr (static struct utmp *buffer);
|
||||
|
||||
|
||||
struct utmp *
|
||||
@ -30,7 +30,13 @@ __getutline (const struct utmp *line)
|
||||
{
|
||||
struct utmp *result;
|
||||
|
||||
if (__getutline_r (line, &buffer, &result) < 0)
|
||||
if (buffer == NULL)
|
||||
{
|
||||
buffer = (struct utmp *) malloc (sizeof (struct utmp));
|
||||
if (buffer == NULL)
|
||||
return NULL;
|
||||
}
|
||||
if (__getutline_r (line, buffer, &result) < 0)
|
||||
return NULL;
|
||||
|
||||
return result;
|
||||
|
@ -50,7 +50,7 @@
|
||||
|
||||
static FILE *mallstream;
|
||||
static const char mallenv[]= "MALLOC_TRACE";
|
||||
static char malloc_trace_buffer[TRACE_BUFFER_SIZE];
|
||||
static char *malloc_trace_buffer;
|
||||
|
||||
__libc_lock_define_initialized (static, lock);
|
||||
|
||||
@ -237,7 +237,7 @@ tr_reallochook (ptr, size, caller)
|
||||
/* This function gets called to make sure all memory the library
|
||||
allocates get freed and so does not irritate the user when studying
|
||||
the mtrace output. */
|
||||
static void
|
||||
static void __libc_freeres_fn_section
|
||||
release_libc_mem (void)
|
||||
{
|
||||
/* Only call the free function if we still are running in mtrace mode. */
|
||||
@ -274,6 +274,10 @@ mtrace ()
|
||||
#endif
|
||||
if (mallfile != NULL || mallwatch != NULL)
|
||||
{
|
||||
char *mtb = malloc (TRACE_BUFFER_SIZE);
|
||||
if (mtb == NULL)
|
||||
return;
|
||||
|
||||
mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "w");
|
||||
if (mallstream != NULL)
|
||||
{
|
||||
@ -285,6 +289,7 @@ mtrace ()
|
||||
__fcntl (fileno (mallstream), F_SETFD, flags);
|
||||
}
|
||||
/* Be sure it doesn't malloc its buffer! */
|
||||
malloc_trace_buffer = mtb;
|
||||
setvbuf (mallstream, malloc_trace_buffer, _IOFBF, TRACE_BUFFER_SIZE);
|
||||
fprintf (mallstream, "= Start\n");
|
||||
tr_old_free_hook = __free_hook;
|
||||
@ -303,6 +308,8 @@ mtrace ()
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
free (mtb);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -418,6 +418,10 @@ _obstack_free (h, obj)
|
||||
|
||||
/* This function is used from ANSI code. */
|
||||
|
||||
#ifdef _LIBC
|
||||
strong_alias (_obstack_free, obstack_free)
|
||||
#else
|
||||
|
||||
void
|
||||
obstack_free (h, obj)
|
||||
struct obstack *h;
|
||||
@ -449,6 +453,7 @@ obstack_free (h, obj)
|
||||
/* obj is not in any of the chunks! */
|
||||
abort ();
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
_obstack_memory_used (h)
|
||||
|
@ -27,7 +27,9 @@
|
||||
|
||||
DEFINE_HOOK (__libc_subfreeres, (void));
|
||||
|
||||
void
|
||||
symbol_set_define (__libc_freeres_ptrs);
|
||||
|
||||
void __libc_freeres_fn_section
|
||||
__libc_freeres (void)
|
||||
{
|
||||
/* This function might be called from different places. So better
|
||||
@ -36,11 +38,17 @@ __libc_freeres (void)
|
||||
|
||||
if (compare_and_swap (&already_called, 0, 1))
|
||||
{
|
||||
void * const *p;
|
||||
|
||||
#ifdef USE_IN_LIBIO
|
||||
_IO_cleanup ();
|
||||
#endif
|
||||
|
||||
RUN_HOOK (__libc_subfreeres, ());
|
||||
|
||||
for (p = symbol_set_first_element (__libc_freeres_ptrs);
|
||||
! symbol_set_end_p (__libc_freeres_ptrs, p); ++p)
|
||||
free (*p);
|
||||
}
|
||||
}
|
||||
libc_hidden_def (__libc_freeres)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Compatibility functions for floating point formatting.
|
||||
Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 1996, 1997, 1999, 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
|
||||
@ -57,7 +57,7 @@
|
||||
|
||||
static char FCVT_BUFFER[MAXDIG];
|
||||
static char ECVT_BUFFER[MAXDIG];
|
||||
static char *FCVT_BUFPTR;
|
||||
libc_freeres_ptr (static char *FCVT_BUFPTR);
|
||||
|
||||
char *
|
||||
APPEND (FUNC_PREFIX, fcvt) (value, ndigit, decpt, sign)
|
||||
@ -102,13 +102,3 @@ APPEND (FUNC_PREFIX, gcvt) (value, ndigit, buf)
|
||||
sprintf (buf, "%.*" FLOAT_FMT_FLAG "g", MIN (ndigit, NDIGIT_MAX), value);
|
||||
return buf;
|
||||
}
|
||||
|
||||
/* Free all resources if necessary. */
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
{
|
||||
if (FCVT_BUFPTR != NULL)
|
||||
free (FCVT_BUFPTR);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -180,9 +180,7 @@ fstab_convert (struct fstab_state *state)
|
||||
|
||||
/* Make sure the memory is freed if the programs ends while in
|
||||
memory-debugging mode and something actually was allocated. */
|
||||
static void
|
||||
__attribute__ ((unused))
|
||||
fstab_free (void)
|
||||
libc_freeres_fn (fstab_free)
|
||||
{
|
||||
char *buffer;
|
||||
|
||||
@ -190,5 +188,3 @@ fstab_free (void)
|
||||
if (buffer != NULL)
|
||||
free ((void *) buffer);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, fstab_free);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Utilities for reading/writing fstab, mtab, etc.
|
||||
Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 1996, 1997, 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
|
||||
@ -24,7 +24,7 @@
|
||||
/* We don't want to allocate the static buffer all the time since it
|
||||
is not always used (in fact, rather infrequently). Accept the
|
||||
extra cost of a `malloc'. */
|
||||
static char *getmntent_buffer;
|
||||
libc_freeres_ptr (static char *getmntent_buffer);
|
||||
|
||||
/* This is the size of the buffer. This is really big. */
|
||||
#define BUFFER_SIZE 4096
|
||||
@ -52,15 +52,3 @@ getmntent (FILE *stream)
|
||||
|
||||
return __getmntent_r (stream, &m, getmntent_buffer, BUFFER_SIZE);
|
||||
}
|
||||
|
||||
|
||||
/* Make sure the memory is freed if the programs ends while in
|
||||
memory-debugging mode and something actually was allocated. */
|
||||
static void
|
||||
__attribute__ ((unused))
|
||||
free_mem (void)
|
||||
{
|
||||
free (getmntent_buffer);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -86,7 +86,7 @@ extern int INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf,
|
||||
__libc_lock_define_initialized (static, lock);
|
||||
|
||||
/* This points to the static buffer used. */
|
||||
static char *buffer;
|
||||
libc_freeres_ptr (static char *buffer);
|
||||
|
||||
|
||||
LOOKUP_TYPE *
|
||||
@ -162,13 +162,3 @@ done:
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Free all resources if necessary. */
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
{
|
||||
free (buffer);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -63,7 +63,7 @@ extern int INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer,
|
||||
__libc_lock_define_initialized (static, lock);
|
||||
|
||||
/* This points to the static buffer used. */
|
||||
static char *buffer;
|
||||
libc_freeres_ptr (static char *buffer);
|
||||
|
||||
|
||||
LOOKUP_TYPE *
|
||||
@ -87,13 +87,3 @@ GETFUNC_NAME (void)
|
||||
__set_errno (save);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Free all resources if necessary. */
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
{
|
||||
free (buffer);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -697,8 +697,7 @@ nss_new_service (name_database *database, const char *name)
|
||||
|
||||
|
||||
/* Free all resources if necessary. */
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
name_database *top = service_table;
|
||||
name_database_entry *entry;
|
||||
@ -745,5 +744,3 @@ free_mem (void)
|
||||
|
||||
free (top);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -696,12 +696,10 @@ re_comp (s)
|
||||
}
|
||||
|
||||
#ifdef _LIBC
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
__regfree (&re_comp_buf);
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
#endif
|
||||
|
||||
#endif /* _REGEX_RE_COMP */
|
||||
|
@ -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 passwd *
|
||||
@ -83,13 +83,3 @@ fgetpwent (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);
|
||||
|
@ -410,9 +410,7 @@ handle_requests (void *arg)
|
||||
|
||||
|
||||
/* Free allocated resources. */
|
||||
static void
|
||||
__attribute__ ((unused))
|
||||
free_res (void)
|
||||
libc_freeres_fn (free_res)
|
||||
{
|
||||
size_t row;
|
||||
|
||||
@ -421,4 +419,3 @@ free_res (void)
|
||||
|
||||
free (pool);
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_res);
|
||||
|
@ -309,7 +309,9 @@ ns_sprintrrf(const u_char *msg, size_t msglen,
|
||||
break;
|
||||
|
||||
case ns_t_nsap: {
|
||||
char t[255*3];
|
||||
/* 2*255 for hex digits, 128 for '.' and '\0', 2 for
|
||||
0x if inet_nsap_ntoa starts using it. */
|
||||
char t[255*2 + 128 + 2];
|
||||
|
||||
(void) inet_nsap_ntoa(rdlen, rdata, t);
|
||||
T(addstr(t, strlen(t), &buf, &buflen));
|
||||
|
@ -70,7 +70,7 @@ char *
|
||||
inet_nsap_ntoa(int binlen, const u_char *binary, char *ascii) {
|
||||
int nib;
|
||||
int i;
|
||||
static char tmpbuf[255*3];
|
||||
static char tmpbuf[255*2 + 128];
|
||||
char *start;
|
||||
|
||||
if (ascii)
|
||||
|
@ -489,6 +489,7 @@ _res_hconf_init (void)
|
||||
|
||||
|
||||
/* List of known interfaces. */
|
||||
libc_freeres_ptr (
|
||||
static struct netaddr
|
||||
{
|
||||
int addrtype;
|
||||
@ -500,7 +501,7 @@ static struct netaddr
|
||||
u_int32_t mask;
|
||||
} ipv4;
|
||||
} u;
|
||||
} *ifaddrs;
|
||||
} *ifaddrs);
|
||||
|
||||
/* We need to protect the dynamic buffer handling. */
|
||||
__libc_lock_define_initialized (static, lock);
|
||||
@ -657,13 +658,3 @@ _res_hconf_trim_domains (struct hostent *hp)
|
||||
for (i = 0; hp->h_aliases[i]; ++i)
|
||||
_res_hconf_trim_domain (hp->h_aliases[i]);
|
||||
}
|
||||
|
||||
|
||||
/* Free all resources if necessary. */
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
{
|
||||
free (ifaddrs);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 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
|
||||
@ -29,7 +29,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 shadow entry from the given stream. */
|
||||
struct spwd *
|
||||
@ -86,13 +86,3 @@ fgetspent (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);
|
||||
|
@ -117,7 +117,7 @@ find_spec (const UCHAR_T *format, mbstate_t *ps)
|
||||
|
||||
|
||||
/* These are defined in reg-printf.c. */
|
||||
extern printf_arginfo_function *__printf_arginfo_table[] attribute_hidden;
|
||||
extern printf_arginfo_function **__printf_arginfo_table attribute_hidden;
|
||||
extern printf_function **__printf_function_table attribute_hidden;
|
||||
|
||||
|
||||
@ -354,7 +354,7 @@ parse_one_spec (const UCHAR_T *format, size_t posn, struct printf_spec *spec,
|
||||
|
||||
/* Get the format specification. */
|
||||
spec->info.spec = (wchar_t) *format++;
|
||||
if (__printf_function_table != NULL
|
||||
if (__builtin_expect (__printf_function_table != NULL, 0)
|
||||
&& spec->info.spec <= UCHAR_MAX
|
||||
&& __printf_arginfo_table[spec->info.spec] != NULL)
|
||||
/* We don't try to get the types for all arguments if the format
|
||||
|
@ -21,10 +21,8 @@
|
||||
#include <printf.h>
|
||||
|
||||
/* Array of functions indexed by format character. */
|
||||
static printf_function *printf_funcs[UCHAR_MAX + 1];
|
||||
printf_arginfo_function *__printf_arginfo_table[UCHAR_MAX + 1]
|
||||
attribute_hidden;
|
||||
|
||||
libc_freeres_ptr (printf_arginfo_function **__printf_arginfo_table)
|
||||
attribute_hidden;
|
||||
printf_function **__printf_function_table attribute_hidden;
|
||||
|
||||
int __register_printf_function __P ((int, printf_function,
|
||||
@ -43,9 +41,18 @@ __register_printf_function (spec, converter, arginfo)
|
||||
return -1;
|
||||
}
|
||||
|
||||
__printf_function_table = printf_funcs;
|
||||
if (__printf_function_table == NULL)
|
||||
{
|
||||
__printf_arginfo_table = (printf_arginfo_function **)
|
||||
malloc ((UCHAR_MAX + 1) * sizeof (void *) * 2);
|
||||
if (__printf_arginfo_table == NULL)
|
||||
return -1;
|
||||
__printf_function_table = (printf_function **)
|
||||
(__printf_arginfo_table + UCHAR_MAX + 1);
|
||||
}
|
||||
|
||||
__printf_function_table[spec] = converter;
|
||||
__printf_arginfo_table[spec] = arginfo;
|
||||
printf_funcs[spec] = converter;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -390,8 +390,7 @@ addseverity (int severity, const char *string)
|
||||
}
|
||||
|
||||
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
struct severity_info *runp = severity_list;
|
||||
|
||||
@ -407,4 +406,3 @@ free_mem (void)
|
||||
else
|
||||
runp = runp->next;
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 93, 94, 95, 96, 98 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 93, 94, 95, 96, 98, 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
|
||||
@ -16,16 +16,30 @@
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <libintl.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* Return a string describing the errno code in ERRNUM.
|
||||
The storage is good only until the next call to strerror.
|
||||
Writing to the storage causes undefined behavior. */
|
||||
libc_freeres_ptr (static char *buf);
|
||||
|
||||
char *
|
||||
strerror (errnum)
|
||||
int errnum;
|
||||
{
|
||||
static char buf[1024];
|
||||
return __strerror_r (errnum, buf, sizeof buf);
|
||||
char *ret = __strerror_r (errnum, NULL, 0);
|
||||
int saved_errno;
|
||||
|
||||
if (__builtin_expect (ret != NULL, 1))
|
||||
return ret;
|
||||
saved_errno = errno;
|
||||
if (buf == NULL)
|
||||
buf = malloc (1024);
|
||||
__set_errno (saved_errno);
|
||||
if (buf == NULL)
|
||||
return _("Unknown error");
|
||||
return __strerror_r (errnum, buf, 1024);
|
||||
}
|
||||
|
@ -413,9 +413,8 @@ auth_errmsg (enum auth_stat stat)
|
||||
}
|
||||
|
||||
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
/* Not libc_freeres_ptr, since buf is a macro. */
|
||||
free (buf);
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -323,8 +323,7 @@ clearenv ()
|
||||
return 0;
|
||||
}
|
||||
#ifdef _LIBC
|
||||
static void
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
/* Remove all traces. */
|
||||
clearenv ();
|
||||
@ -333,8 +332,6 @@ free_mem (void)
|
||||
__tdestroy (known_values, free);
|
||||
known_values = NULL;
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
||||
|
||||
# undef setenv
|
||||
# undef unsetenv
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 92, 93, 96, 97, 98, 2000 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991,92,93,96,97,98,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
|
||||
@ -32,7 +32,7 @@ static char *getttyname (int fd, dev_t mydev, ino_t myino,
|
||||
int save, int *dostat) internal_function;
|
||||
|
||||
|
||||
static char *getttyname_name;
|
||||
libc_freeres_ptr (static char *getttyname_name);
|
||||
|
||||
static char *
|
||||
internal_function
|
||||
@ -134,11 +134,3 @@ ttyname (fd)
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
free_mem (void)
|
||||
{
|
||||
free (getttyname_name);
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -530,7 +530,7 @@ handle_fildes_io (void *arg)
|
||||
aiocbp->aiocb64.aio_offset));
|
||||
else
|
||||
aiocbp->aiocb.__return_value =
|
||||
TEMP_FAILURE_RETRY (pwrite (fildes, (const void *)
|
||||
TEMP_FAILURE_RETRY (__libc_pwrite (fildes, (const void *)
|
||||
aiocbp->aiocb.aio_buf,
|
||||
aiocbp->aiocb.aio_nbytes,
|
||||
aiocbp->aiocb.aio_offset));
|
||||
@ -665,9 +665,7 @@ handle_fildes_io (void *arg)
|
||||
|
||||
|
||||
/* Free allocated resources. */
|
||||
static void
|
||||
__attribute__ ((unused))
|
||||
free_res (void)
|
||||
libc_freeres_fn (free_res)
|
||||
{
|
||||
size_t row;
|
||||
|
||||
@ -676,7 +674,6 @@ free_res (void)
|
||||
|
||||
free (pool);
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_res);
|
||||
|
||||
|
||||
/* Add newrequest to the runlist. The __abs_prio flag of newrequest must
|
||||
|
@ -38,7 +38,7 @@
|
||||
static const char path_proc[] = "/proc";
|
||||
|
||||
/* Actual mount point of /proc filesystem. */
|
||||
static char *mount_proc;
|
||||
libc_freeres_ptr (static char *mount_proc);
|
||||
|
||||
/* Determine the path to the /proc filesystem if available. */
|
||||
static const char *
|
||||
@ -319,11 +319,3 @@ __get_avphys_pages ()
|
||||
return phys_pages_info ("MemFree: %ld kB");
|
||||
}
|
||||
weak_alias (__get_avphys_pages, get_avphys_pages)
|
||||
|
||||
|
||||
static void
|
||||
free_mem (void)
|
||||
{
|
||||
free (mount_proc);
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -226,14 +226,10 @@ shm_unlink (const char *name)
|
||||
}
|
||||
|
||||
|
||||
static void __attribute__ ((unused))
|
||||
freeit (void)
|
||||
/* Make sure the table is freed if we want to free everything before
|
||||
exiting. */
|
||||
libc_freeres_fn (freeit)
|
||||
{
|
||||
if (mountpoint.dir != defaultdir)
|
||||
free (mountpoint.dir);
|
||||
}
|
||||
|
||||
|
||||
/* Make sure the table is freed if we want to free everything before
|
||||
exiting. */
|
||||
text_set_element (__libc_subfreeres, freeit);
|
||||
|
@ -38,7 +38,7 @@ static char *getttyname (const char *dev, dev_t mydev,
|
||||
internal_function;
|
||||
|
||||
|
||||
static char *getttyname_name;
|
||||
libc_freeres_ptr (static char *getttyname_name);
|
||||
|
||||
static char *
|
||||
internal_function
|
||||
@ -103,7 +103,7 @@ getttyname (const char *dev, dev_t mydev, ino64_t myino, int save, int *dostat)
|
||||
|
||||
|
||||
/* Static buffer in `ttyname'. */
|
||||
static char *ttyname_buf;
|
||||
libc_freeres_ptr (static char *ttyname_buf);
|
||||
|
||||
|
||||
/* Return the pathname of the terminal FD is open on, or NULL on errors.
|
||||
@ -186,12 +186,3 @@ ttyname (int fd)
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
free_mem (void)
|
||||
{
|
||||
free (ttyname_buf);
|
||||
free (getttyname_name);
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
@ -49,7 +49,7 @@ static struct ttinfo *find_transition (time_t timer) internal_function;
|
||||
static void compute_tzname_max (size_t) internal_function;
|
||||
|
||||
static size_t num_transitions;
|
||||
static time_t *transitions;
|
||||
libc_freeres_ptr (static time_t *transitions);
|
||||
static unsigned char *type_idxs;
|
||||
static size_t num_types;
|
||||
static struct ttinfo *types;
|
||||
@ -553,14 +553,3 @@ compute_tzname_max (size_t chars)
|
||||
}
|
||||
while (++p < &zone_names[chars]);
|
||||
}
|
||||
|
||||
/* This function is only called when we are checking for memory leaks. */
|
||||
static void
|
||||
freeres (void)
|
||||
{
|
||||
if (transitions != NULL)
|
||||
free ((void *) transitions);
|
||||
}
|
||||
|
||||
/* Make sure all allocated data is freed before exiting. */
|
||||
text_set_element (__libc_subfreeres, freeres);
|
||||
|
@ -624,8 +624,7 @@ __tz_convert (const time_t *timer, int use_localtime, struct tm *tp)
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
free_mem (void)
|
||||
libc_freeres_fn (free_mem)
|
||||
{
|
||||
while (tzstring_list != NULL)
|
||||
{
|
||||
@ -637,4 +636,3 @@ free_mem (void)
|
||||
free (old_tz);
|
||||
old_tz = NULL;
|
||||
}
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
||||
|
Loading…
Reference in New Issue
Block a user