mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
[BZ #677]
* 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:
parent
028dca779d
commit
6aa10807fc
43
ChangeLog
43
ChangeLog
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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) *,
|
||||||
|
@ -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)
|
||||||
|
@ -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))
|
||||||
|
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user