2.3.3-68
authorjakub <jakub>
Thu, 14 Oct 2004 09:57:38 +0000 (09:57 +0000)
committerjakub <jakub>
Thu, 14 Oct 2004 09:57:38 +0000 (09:57 +0000)
elf/dl-close.c
elf/dl-load.c
elf/rtld.c
include/errno.h
linuxthreads/sysdeps/pthread/errno-loc.c
sysdeps/generic/errno-loc.c
sysdeps/sparc/fpu/bits/mathinline.h
sysdeps/unix/sysv/linux/i386/setresgid.c
sysdeps/unix/sysv/linux/i386/setresuid.c

index 4f015fd..c823b17 100644 (file)
@@ -237,7 +237,7 @@ _dl_close (void *_map)
                                struct link_map *rl = depmap->l_initfini[k];
 
                                if (rl->l_idx < nopencount
-                                   & list[rl->l_idx] == rl)
+                                   && list[rl->l_idx] == rl)
                                  {
                                    assert (new_opencount[rl->l_idx] > 0);
                                    if (--new_opencount[rl->l_idx] ==  0)
index 83d46f0..27f6e3f 100644 (file)
@@ -909,7 +909,9 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
   l = _dl_new_object (realname, name, l_type, loader, mode, nsid);
   if (__builtin_expect (l == NULL, 0))
     {
+#ifdef SHARED
     fail_new:
+#endif
       errstring = N_("cannot create shared object descriptor");
       goto call_lose_errno;
     }
index 2039a77..4adbb43 100644 (file)
@@ -537,7 +537,7 @@ _dl_start (void *arg)
 # define ELF_MACHINE_START_ADDRESS(map, start) (start)
 #endif
 
-    return ELF_MACHINE_START_ADDRESS (GL(dl_loaded), entry);
+    return ELF_MACHINE_START_ADDRESS (GL(dl_ns)[LM_ID_BASE]._ns_loaded, entry);
   }
 }
 
@@ -1090,32 +1090,36 @@ of this helper program; chances are you did not intend to run this program.\n\
 #if defined(__i386__)
   /* Force non-TLS libraries for glibc 2.0 binaries
      or if a buggy binary references non-TLS errno or h_errno.  */
-  if (__builtin_expect (GL(dl_loaded)->l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERNEED)] == NULL, 0)
-      && GL(dl_loaded)->l_info[DT_DEBUG])
+  if (__builtin_expect (main_map->l_info[DT_NUM + DT_THISPROCNUM
+                                         + DT_VERSIONTAGIDX (DT_VERNEED)]
+                        == NULL, 0)
+      && main_map->l_info[DT_DEBUG])
     GLRO(dl_osversion) = 0x20205;
   else if ((__builtin_expect (mode, normal) != normal
-           || GL(dl_loaded)->l_info [ADDRIDX (DT_GNU_LIBLIST)] == NULL)
+           || main_map->l_info[ADDRIDX (DT_GNU_LIBLIST)] == NULL)
              /* Only binaries have DT_DEBUG dynamic tags...  */
-          && GL(dl_loaded)->l_info[DT_DEBUG])
+          && main_map->l_info[DT_DEBUG])
     {
       /* Workaround for buggy binaries.  This doesn't handle buggy
         libraries.  */
       bool buggy = false;
-      const ElfW(Sym) *symtab = (const void *) D_PTR (GL(dl_loaded), l_info[DT_SYMTAB]);
-      const char *strtab = (const void *) D_PTR (GL(dl_loaded), l_info[DT_STRTAB]);
+      const ElfW(Sym) *symtab = (const void *) D_PTR (main_map,
+                                                      l_info[DT_SYMTAB]);
+      const char *strtab = (const void *) D_PTR (main_map,
+                                                 l_info[DT_STRTAB]);
       Elf_Symndx symidx;
-      for (symidx = GL(dl_loaded)->l_buckets[0x6c994f % GL(dl_loaded)->l_nbuckets];
+      for (symidx = main_map->l_buckets[0x6c994f % main_map->l_nbuckets];
           symidx != STN_UNDEF;
-          symidx = GL(dl_loaded)->l_chain[symidx])
+          symidx = main_map->l_chain[symidx])
        {
          if (__builtin_expect (strcmp (strtab + symtab[symidx].st_name,
                                        "errno") == 0, 0)
              && ELFW(ST_TYPE) (symtab[symidx].st_info) != STT_TLS)
            buggy = true;
        }
-      for (symidx = GL(dl_loaded)->l_buckets[0xe5c992f % GL(dl_loaded)->l_nbuckets];
+      for (symidx = main_map->l_buckets[0xe5c992f % main_map->l_nbuckets];
           symidx != STN_UNDEF;
-          symidx = GL(dl_loaded)->l_chain[symidx])
+          symidx = main_map->l_chain[symidx])
        {
          if (__builtin_expect (strcmp (strtab + symtab[symidx].st_name,
                                        "h_errno") == 0, 0)
@@ -1315,8 +1319,11 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
    */
 #define LIB_NOVERSION "/lib/libNoVersion.so.1"
 
-  if (__builtin_expect (GL(dl_loaded)->l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERNEED)] == NULL, 0)
-      && (GL(dl_loaded)->l_info[DT_DEBUG] || !(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)))
+  if (__builtin_expect (main_map->l_info[DT_NUM + DT_THISPROCNUM
+                                         + DT_VERSIONTAGIDX (DT_VERNEED)]
+                        == NULL, 0)
+      && (main_map->l_info[DT_DEBUG]
+          || !(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)))
     {
       struct stat test_st;
       int test_fd;
@@ -1343,8 +1350,8 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
 
       if (can_load != 0) {
          struct link_map *new_map;
-         new_map = _dl_map_object (GL(dl_loaded), LIB_NOVERSION,
-                                   1, lt_library, 0, 0);
+         new_map = _dl_map_object (main_map, LIB_NOVERSION,
+                                   1, lt_library, 0, 0, LM_ID_BASE);
          if (++new_map->l_opencount == 1) {
              /* It is no duplicate.  */
              ++npreloads;
index 13d17f9..d9f95aa 100644 (file)
@@ -36,7 +36,11 @@ extern __thread int errno attribute_tls_model_ie;
 # define __set_errno(val) (errno = (val))
 
 # ifndef __ASSEMBLER__
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
+extern int *__errno_location (void) __THROW __attribute__ ((__const__))
+#  ifdef RTLD_PRIVATE_ERRNO
+     attribute_hidden
+#  endif
+;
 libc_hidden_proto (__errno_location)
 # endif
 
index d3e49b7..0a8f0f9 100644 (file)
@@ -1,6 +1,6 @@
 /* MT support function to get address of `errno' variable, linuxthreads
    version.
-   Copyright (C) 1996, 1998, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1998, 2002, 2003, 2004 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
@@ -23,7 +23,7 @@
 #include <linuxthreads/internals.h>
 #include <sysdep-cancel.h>
 
-#if ! USE___THREAD
+#if ! USE___THREAD && !RTLD_PRIVATE_ERRNO
 #undef errno
 extern int errno;
 #endif
index fd16103..633590f 100644 (file)
@@ -1,6 +1,6 @@
 /* MT support function to get address of `errno' variable, non-threaded
    version.
-   Copyright (C) 1996, 1998, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1998, 2002, 2004 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,7 +21,7 @@
 #include <errno.h>
 #include <tls.h>
 
-#if ! USE___THREAD
+#if ! USE___THREAD && !RTLD_PRIVATE_ERRNO
 #undef errno
 extern int errno;
 #endif
index 2b578d0..7add493 100644 (file)
 
 /* Test for negative number.  Used in the signbit() macro.  */
 __MATH_INLINE int
-__signbitf (float __x) __THROW
+__NTH (__signbitf (float __x))
 {
   __extension__ union { float __f; int __i; } __u = { __f: __x };
   return __u.__i < 0;
@@ -121,14 +121,14 @@ __signbitf (float __x) __THROW
 #   if __WORDSIZE == 32
 
 __MATH_INLINE int
-__signbit (double __x) __THROW
+__NTH (__signbit (double __x))
 {
   __extension__ union { double __d; int __i[2]; } __u = { __d: __x };
   return __u.__i[0] < 0;
 }
 
 __MATH_INLINE int
-__signbitl (long double __x) __THROW
+__NTH (__signbitl (long double __x))
 {
   return __signbit ((double)__x);
 }
@@ -136,14 +136,14 @@ __signbitl (long double __x) __THROW
 #   else /* sparc64 */
 
 __MATH_INLINE int
-__signbit (double __x) __THROW
+__NTH (__signbit (double __x))
 {
   __extension__ union { double __d; long int __i; } __u = { __d: __x };
   return __u.__i < 0;
 }
 
 __MATH_INLINE int
-__signbitl (long double __x) __THROW
+__NTH (__signbitl (long double __x))
 {
   __extension__ union { long double __l; long int __i[2]; } __u = { __l: __x };
   return __u.__i[0] < 0;
@@ -156,7 +156,7 @@ __signbitl (long double __x) __THROW
 #  if !defined __NO_MATH_INLINES && !__GNUC_PREREQ (3, 2)
 
 __MATH_INLINE double
-sqrt (double __x) __THROW
+__NTH (sqrt (double __x))
 {
   register double __r;
   __asm ("fsqrtd %1,%0" : "=f" (__r) : "f" (__x));
@@ -164,7 +164,7 @@ sqrt (double __x) __THROW
 }
 
 __MATH_INLINE float
-sqrtf (float __x) __THROW
+__NTH (sqrtf (float __x))
 {
   register float __r;
   __asm ("fsqrts %1,%0" : "=f" (__r) : "f" (__x));
@@ -173,7 +173,7 @@ sqrtf (float __x) __THROW
 
 #   if __WORDSIZE == 64
 __MATH_INLINE long double
-sqrtl (long double __x) __THROW
+__NTH (sqrtl (long double __x))
 {
   long double __r;
   extern void _Qp_sqrt (long double *, __const__ long double *);
@@ -219,16 +219,16 @@ __ieee754_sqrtl (long double __x)
 
 #  ifndef __NO_MATH_INLINES
 
-__MATH_INLINE double fdim (double __x, double __y) __THROW;
+__MATH_INLINE double __NTH (fdim (double __x, double __y));
 __MATH_INLINE double
-fdim (double __x, double __y) __THROW
+__NTH (fdim (double __x, double __y))
 {
   return __x <= __y ? 0 : __x - __y;
 }
 
-__MATH_INLINE float fdimf (float __x, float __y) __THROW;
+__MATH_INLINE float __NTH (fdimf (float __x, float __y));
 __MATH_INLINE float
-fdimf (float __x, float __y) __THROW
+__NTH (fdimf (float __x, float __y))
 {
   return __x <= __y ? 0 : __x - __y;
 }
index ee782e4..614e2c2 100644 (file)
@@ -28,7 +28,7 @@
 #include <pthread-functions.h>
 
 
-#ifdef __NR_setresgid
+#if defined __NR_setresgid || defined __NR_setresgid32
 
 # ifdef __NR_setresgid32
 #  if __ASSUME_32BITUIDS == 0
@@ -43,7 +43,7 @@ __setresgid (gid_t rgid, gid_t egid, gid_t sgid)
 {
   int result;
 
-# if __ASSUME_32BITUIDS > 0
+# if __ASSUME_32BITUIDS > 0 || !defined __NR_setresgid
   result = INLINE_SYSCALL (setresgid32, 3, rgid, egid, sgid);
 # else
 #  ifdef __NR_setresgid32
index 66e5a1c..4d735ca 100644 (file)
@@ -28,7 +28,7 @@
 #include <pthread-functions.h>
 
 
-#ifdef __NR_setresuid
+#if defined __NR_setresuid || defined __NR_setresuid32
 
 # ifdef __NR_setresuid32
 #  if __ASSUME_32BITUIDS == 0
@@ -43,7 +43,7 @@ __setresuid (uid_t ruid, uid_t euid, uid_t suid)
 {
   int result;
 
-# if __ASSUME_32BITUIDS > 0
+# if __ASSUME_32BITUIDS > 0 || !defined __NR_setresuid
   result = INLINE_SYSCALL (setresuid32, 3, ruid, euid, suid);
 # else
 #  ifdef __NR_setresuid32