* nscd/nscd.c (termination_handler): Avoid segfault if some database
	is not enabled.

	* nscd/nscd_getai.c (__nscd_getai): If ai_resp->found == -1, set
	__nss_not_use_nscd_hosts and return -1.
	* nscd/nscd_initgroups.c (__nscd_getgrouplist): If
	initgr_resp->found == -1, set __nss_not_use_nscd_group and return -1.
	Avoid leaking sockets.

2005-01-28  Andreas Schwab  <schwab@suse.de>
	    H.J. Lu  <hongjiu.lu@intel.com>

	[BZ #677]
	* elf/dl-runtime.c (fixup): Change return type to
	DL_FIXUP_VALUE_TYPE. Use DL_FIXUP_VALUE_TYPE,
	DL_FIXUP_MAKE_VALUE and DL_FIXUP_VALUE_CODE_ADDR for relocation
	values. Use DL_FIXUP_VALUE_ADDR and DL_FIXUP_ADDR_VALUE to
	store and retrieve relocation values.
	(profile_fixup): Likewise.
	* include/link.h (link_map): Use DL_FIXUP_VALUE_TYPE for
	l_reloc_result.
	* sysdeps/generic/dl-fptr.h (link_map): Forward declaration.
	* sysdeps/generic/dl-lookupcfg.h (DL_FIXUP_VALUE_TYPE): New.
	(DL_FIXUP_MAKE_VALUE): Likewise.
	(DL_FIXUP_VALUE_CODE_ADDR): Likewise.
	(DL_FIXUP_VALUE_ADDR): Likewise.
	(DL_FIXUP_ADDR_VALUE): Likewise.
	* sysdeps/ia64/dl-lookupcfg.h: Include <dl-fptr.h> for "struct fdesc".
	(DL_FIXUP_VALUE_TYPE): New.
	(DL_FIXUP_MAKE_VALUE): Likewise.
	(DL_FIXUP_VALUE_CODE_ADDR): Likewise.
	(DL_FIXUP_VALUE_ADDR): Likewise.
	(DL_FIXUP_ADDR_VALUE): Likewise.
	* sysdeps/ia64/dl-machine.h (elf_machine_profile_fixup_plt): Removed.
	(elf_machine_profile_plt): Removed.
	(elf_machine_fixup_plt): Change return type and type of value
	parameter to struct fdesc.
	(elf_machine_plt_value): Likewise.
	(elf_machine_rela): Use DL_FIXUP_MAKE_VALUE to construct
	argument for elf_machine_fixup_plt.

2005-02-07  Jakub Jelinek  <jakub@redhat.com>
This commit is contained in:
Ulrich Drepper 2005-02-07 22:56:07 +00:00
parent 028dca779d
commit 6aa10807fc
9 changed files with 103 additions and 21 deletions

View File

@ -1,3 +1,46 @@
2005-02-07 Jakub Jelinek <jakub@redhat.com>
* nscd/nscd.c (termination_handler): Avoid segfault if some database
is not enabled.
* nscd/nscd_getai.c (__nscd_getai): If ai_resp->found == -1, set
__nss_not_use_nscd_hosts and return -1.
* nscd/nscd_initgroups.c (__nscd_getgrouplist): If
initgr_resp->found == -1, set __nss_not_use_nscd_group and return -1.
Avoid leaking sockets.
2005-01-28 Andreas Schwab <schwab@suse.de>
H.J. Lu <hongjiu.lu@intel.com>
[BZ #677]
* elf/dl-runtime.c (fixup): Change return type to
DL_FIXUP_VALUE_TYPE. Use DL_FIXUP_VALUE_TYPE,
DL_FIXUP_MAKE_VALUE and DL_FIXUP_VALUE_CODE_ADDR for relocation
values. Use DL_FIXUP_VALUE_ADDR and DL_FIXUP_ADDR_VALUE to
store and retrieve relocation values.
(profile_fixup): Likewise.
* include/link.h (link_map): Use DL_FIXUP_VALUE_TYPE for
l_reloc_result.
* sysdeps/generic/dl-fptr.h (link_map): Forward declaration.
* sysdeps/generic/dl-lookupcfg.h (DL_FIXUP_VALUE_TYPE): New.
(DL_FIXUP_MAKE_VALUE): Likewise.
(DL_FIXUP_VALUE_CODE_ADDR): Likewise.
(DL_FIXUP_VALUE_ADDR): Likewise.
(DL_FIXUP_ADDR_VALUE): Likewise.
* sysdeps/ia64/dl-lookupcfg.h: Include <dl-fptr.h> for "struct fdesc".
(DL_FIXUP_VALUE_TYPE): New.
(DL_FIXUP_MAKE_VALUE): Likewise.
(DL_FIXUP_VALUE_CODE_ADDR): Likewise.
(DL_FIXUP_VALUE_ADDR): Likewise.
(DL_FIXUP_ADDR_VALUE): Likewise.
* sysdeps/ia64/dl-machine.h (elf_machine_profile_fixup_plt): Removed.
(elf_machine_profile_plt): Removed.
(elf_machine_fixup_plt): Change return type and type of value
parameter to struct fdesc.
(elf_machine_plt_value): Likewise.
(elf_machine_rela): Use DL_FIXUP_MAKE_VALUE to construct
argument for elf_machine_fixup_plt.
2005-02-07 Jakub Jelinek <jakub@redhat.com> 2005-02-07 Jakub Jelinek <jakub@redhat.com>
* nscd/nscd.init (reload): Print Reloading nscd: before and a newline * nscd/nscd.init (reload): Print Reloading nscd: before and a newline

View File

@ -214,7 +214,7 @@ struct link_map
/* Collected results of relocation while profiling. */ /* Collected results of relocation while profiling. */
struct reloc_result struct reloc_result
{ {
ElfW(Addr) addr; DL_FIXUP_VALUE_TYPE addr;
struct link_map *bound; struct link_map *bound;
unsigned int boundndx; unsigned int boundndx;
uint32_t enterexit; uint32_t enterexit;

View File

@ -442,6 +442,9 @@ termination_handler (int signum)
/* Synchronize memory. */ /* Synchronize memory. */
for (int cnt = 0; cnt < lastdb; ++cnt) for (int cnt = 0; cnt < lastdb; ++cnt)
{ {
if (!dbs[cnt].enabled)
continue;
/* Make sure nobody keeps using the database. */ /* Make sure nobody keeps using the database. */
dbs[cnt].head->timestamp = 0; dbs[cnt].head->timestamp = 0;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2004 Free Software Foundation, Inc. /* Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
@ -78,7 +78,7 @@ __nscd_getai (const char *key, struct nscd_ai_result **result, int *h_errnop)
sizeof (ai_resp_mem)); sizeof (ai_resp_mem));
if (sock == -1) if (sock == -1)
{ {
/* nscd not running or wrong version or hosts caching disabled. */ /* nscd not running or wrong version. */
__nss_not_use_nscd_hosts = 1; __nss_not_use_nscd_hosts = 1;
goto out; goto out;
} }
@ -151,6 +151,13 @@ __nscd_getai (const char *key, struct nscd_ai_result **result, int *h_errnop)
} }
else else
{ {
if (__builtin_expect (ai_resp->found == -1, 0))
{
/* The daemon does not cache this database. */
__nss_not_use_nscd_hosts = 1;
goto out_close;
}
/* Store the error number. */ /* Store the error number. */
*h_errnop = ai_resp->error; *h_errnop = ai_resp->error;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2004 Free Software Foundation, Inc. /* Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
@ -75,7 +75,7 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size,
sizeof (initgr_resp_mem)); sizeof (initgr_resp_mem));
if (sock == -1) if (sock == -1)
{ {
/* nscd not running or wrong version or hosts caching disabled. */ /* nscd not running or wrong version. */
__nss_not_use_nscd_group = 1; __nss_not_use_nscd_group = 1;
goto out; goto out;
} }
@ -101,7 +101,7 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size,
(initgr_resp->ngrps + 1) * sizeof (gid_t)); (initgr_resp->ngrps + 1) * sizeof (gid_t));
if (newp == NULL) if (newp == NULL)
/* We cannot increase the buffer size. */ /* We cannot increase the buffer size. */
goto out; goto out_close;
*groupsp = newp; *groupsp = newp;
*size = initgr_resp->ngrps + 1; *size = initgr_resp->ngrps + 1;
@ -125,6 +125,13 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size,
} }
else else
{ {
if (__builtin_expect (initgr_resp->found == -1, 0))
{
/* The daemon does not cache this database. */
__nss_not_use_nscd_group = 1;
goto out_close;
}
/* No group found yet. */ /* No group found yet. */
retval = 0; retval = 0;
@ -143,6 +150,7 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size,
(*groupsp)[retval++] = group; (*groupsp)[retval++] = group;
} }
out_close:
if (sock != -1) if (sock != -1)
close_not_cancel_no_status (sock); close_not_cancel_no_status (sock);
out: out:

View File

@ -36,6 +36,8 @@ struct fdesc_table
struct fdesc fdesc[0]; struct fdesc fdesc[0];
}; };
struct link_map;
extern ElfW(Addr) _dl_boot_fptr_table []; extern ElfW(Addr) _dl_boot_fptr_table [];
extern ElfW(Addr) _dl_make_fptr (struct link_map *, const ElfW(Sym) *, extern ElfW(Addr) _dl_make_fptr (struct link_map *, const ElfW(Sym) *,

View File

@ -17,4 +17,13 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
/* Nothing special. */ /* The type of the return value of fixup/profile_fixup. */
#define DL_FIXUP_VALUE_TYPE ElfW(Addr)
/* Construct a value of type DL_FIXUP_VALUE_TYPE from a code address
and a link map. */
#define DL_FIXUP_MAKE_VALUE(map, addr) (addr)
/* Extract the code address from a value of type DL_FIXUP_MAKE_VALUE.
*/
#define DL_FIXUP_VALUE_CODE_ADDR(value) (value)
#define DL_FIXUP_VALUE_ADDR(value) (value)
#define DL_FIXUP_ADDR_VALUE(addr) (addr)

View File

@ -20,6 +20,8 @@
#define ELF_FUNCTION_PTR_IS_SPECIAL #define ELF_FUNCTION_PTR_IS_SPECIAL
#define DL_UNMAP_IS_SPECIAL #define DL_UNMAP_IS_SPECIAL
#include <dl-fptr.h>
/* We do not support copy relocations for IA-64. */ /* We do not support copy relocations for IA-64. */
#define DL_NO_COPY_RELOCS #define DL_NO_COPY_RELOCS
@ -56,3 +58,15 @@ extern void _dl_unmap (struct link_map *map);
#define DL_DT_INIT_ADDRESS(map, addr) DL_AUTO_FUNCTION_ADDRESS (map, addr) #define DL_DT_INIT_ADDRESS(map, addr) DL_AUTO_FUNCTION_ADDRESS (map, addr)
#define DL_DT_FINI_ADDRESS(map, addr) DL_AUTO_FUNCTION_ADDRESS (map, addr) #define DL_DT_FINI_ADDRESS(map, addr) DL_AUTO_FUNCTION_ADDRESS (map, addr)
/* The type of the return value of fixup/profile_fixup. */
#define DL_FIXUP_VALUE_TYPE struct fdesc
/* Construct a value of type DL_FIXUP_VALUE_TYPE from a code address
and a link map. */
#define DL_FIXUP_MAKE_VALUE(map, addr) \
((struct fdesc) { (addr), (map)->l_info[DT_PLTGOT]->d_un.d_ptr })
/* Extract the code address from a value of type DL_FIXUP_MAKE_VALUE.
*/
#define DL_FIXUP_VALUE_CODE_ADDR(value) (value).ip
#define DL_FIXUP_VALUE_ADDR(value) ((uintptr_t) &(value))
#define DL_FIXUP_ADDR_VALUE(addr) (*(struct fdesc *) (addr))

View File

@ -331,34 +331,29 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
#define ELF_MACHINE_START_ADDRESS(map, start) \ #define ELF_MACHINE_START_ADDRESS(map, start) \
DL_STATIC_FUNCTION_ADDRESS (map, start) DL_STATIC_FUNCTION_ADDRESS (map, start)
#define elf_machine_profile_fixup_plt(l, reloc, rel_addr, value) \
elf_machine_fixup_plt (l, reloc, rel_addr, value)
#define elf_machine_profile_plt(reloc_addr) ((Elf64_Addr) (reloc_addr))
/* Fixup a PLT entry to bounce directly to the function at VALUE. */ /* Fixup a PLT entry to bounce directly to the function at VALUE. */
static inline Elf64_Addr __attribute__ ((always_inline)) static inline struct fdesc __attribute__ ((always_inline))
elf_machine_fixup_plt (struct link_map *l, lookup_t t, elf_machine_fixup_plt (struct link_map *l, lookup_t t,
const Elf64_Rela *reloc, const Elf64_Rela *reloc,
Elf64_Addr *reloc_addr, Elf64_Addr value) Elf64_Addr *reloc_addr, struct fdesc value)
{ {
/* l is the link_map for the caller, t is the link_map for the object /* l is the link_map for the caller, t is the link_map for the object
* being called */ * being called */
/* got has already been relocated in elf_get_dynamic_info() */ /* got has already been relocated in elf_get_dynamic_info() */
reloc_addr[1] = t->l_info[DT_PLTGOT]->d_un.d_ptr; reloc_addr[1] = value.gp;
/* we need a "release" here to ensure that the gp is visible before /* we need a "release" here to ensure that the gp is visible before
the code entry point is updated: */ the code entry point is updated: */
((volatile Elf64_Addr *) reloc_addr)[0] = value; ((volatile Elf64_Addr *) reloc_addr)[0] = value.ip;
return (Elf64_Addr) reloc_addr; return value;
} }
/* Return the final value of a plt relocation. */ /* Return the final value of a plt relocation. */
static inline Elf64_Addr static inline struct fdesc
elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc, elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
Elf64_Addr value) struct fdesc value)
{ {
/* No need to handle rel vs rela since IA64 is rela only */ /* No need to handle rel vs rela since IA64 is rela only */
return value + reloc->r_addend; return (struct fdesc) { value.ip + reloc->r_addend, value.gp };
} }
#endif /* !dl_machine_h */ #endif /* !dl_machine_h */
@ -429,7 +424,8 @@ elf_machine_rela (struct link_map *map,
;/* No adjustment. */ ;/* No adjustment. */
else if (r_type == R_IA64_IPLTLSB) else if (r_type == R_IA64_IPLTLSB)
{ {
elf_machine_fixup_plt (NULL, sym_map, reloc, reloc_addr, value); elf_machine_fixup_plt (NULL, NULL, reloc, reloc_addr,
DL_FIXUP_MAKE_VALUE (sym_map, value));
return; return;
} }
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_FPTR64LSB)) else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_FPTR64LSB))