[BZ #677]
authorUlrich Drepper <drepper@redhat.com>
Mon, 7 Feb 2005 22:56:07 +0000 (22:56 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 7 Feb 2005 22:56:07 +0000 (22:56 +0000)
* 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>

ChangeLog
include/link.h
nscd/nscd.c
nscd/nscd_getai.c
nscd/nscd_initgroups.c
sysdeps/generic/dl-fptr.h
sysdeps/generic/dl-lookupcfg.h
sysdeps/ia64/dl-lookupcfg.h
sysdeps/ia64/dl-machine.h

index 0ce6f70..5b62762 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,48 @@
 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>
+
        * nscd/nscd.init (reload): Print Reloading nscd: before and a newline
        after the status string printed by killproc.
 
index 0681537..9654191 100644 (file)
@@ -214,7 +214,7 @@ struct link_map
     /* Collected results of relocation while profiling.  */
     struct reloc_result
     {
-      ElfW(Addr) addr;
+      DL_FIXUP_VALUE_TYPE addr;
       struct link_map *bound;
       unsigned int boundndx;
       uint32_t enterexit;
index b66abb5..01baed8 100644 (file)
@@ -442,6 +442,9 @@ termination_handler (int signum)
   /* Synchronize memory.  */
   for (int cnt = 0; cnt < lastdb; ++cnt)
     {
+      if (!dbs[cnt].enabled)
+       continue;
+
       /* Make sure nobody keeps using the database.  */
       dbs[cnt].head->timestamp = 0;
 
index 24b374b..866f7b2 100644 (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.
    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));
       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;
          goto out;
        }
@@ -151,6 +151,13 @@ __nscd_getai (const char *key, struct nscd_ai_result **result, int *h_errnop)
     }
   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.  */
       *h_errnop = ai_resp->error;
 
index 2ea9e7f..daddf2e 100644 (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.
    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));
       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;
          goto out;
        }
@@ -101,7 +101,7 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size,
                                 (initgr_resp->ngrps + 1) * sizeof (gid_t));
          if (newp == NULL)
            /* We cannot increase the buffer size.  */
-           goto out;
+           goto out_close;
 
          *groupsp = newp;
          *size = initgr_resp->ngrps + 1;
@@ -125,6 +125,13 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size,
     }
   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.   */
       retval = 0;
 
@@ -143,6 +150,7 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size,
        (*groupsp)[retval++] = group;
     }
 
+ out_close:
   if (sock != -1)
     close_not_cancel_no_status (sock);
  out:
index 8156981..d47fb7b 100644 (file)
@@ -36,6 +36,8 @@ struct fdesc_table
     struct fdesc fdesc[0];
   };
 
+struct link_map;
+
 extern ElfW(Addr) _dl_boot_fptr_table [];
 
 extern ElfW(Addr) _dl_make_fptr (struct link_map *, const ElfW(Sym) *,
index 39c430b..2b29989 100644 (file)
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    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)
index ddf405b..b50030e 100644 (file)
@@ -20,6 +20,8 @@
 #define ELF_FUNCTION_PTR_IS_SPECIAL
 #define DL_UNMAP_IS_SPECIAL
 
+#include <dl-fptr.h>
+
 /* We do not support copy relocations for IA-64.  */
 #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_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))
index 2864315..5534969 100644 (file)
@@ -331,34 +331,29 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
 #define ELF_MACHINE_START_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.  */
-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,
                       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
    * being called */
   /* 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
      the code entry point is updated: */
-  ((volatile Elf64_Addr *) reloc_addr)[0] = value;
-  return (Elf64_Addr) reloc_addr;
+  ((volatile Elf64_Addr *) reloc_addr)[0] = value.ip;
+  return value;
 }
 
 /* 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,
-                      Elf64_Addr value)
+                      struct fdesc value)
 {
   /* 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 */
@@ -429,7 +424,8 @@ elf_machine_rela (struct link_map *map,
            ;/* No adjustment.  */
          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;
            }
          else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_FPTR64LSB))