Remove tcb_size and flag argument for _rtld_allocate_tls,
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Tue, 29 Mar 2005 23:04:36 +0000 (23:04 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Tue, 29 Mar 2005 23:04:36 +0000 (23:04 +0000)
remove tcb_size argument for _rtld_free_tls. The size is defined
by the architecture's struct tls_tcb layout and the behaviour
of RTLD_ALLOC_TLS_FREE_OLD is the only possible reaction for
old_tcb != NULL which doesn't leak memory.

lib/libc/gen/tls.c
lib/libthread_xu/arch/amd64/amd64/pthread_md.c
lib/libthread_xu/arch/i386/i386/pthread_md.c
libexec/rtld-elf/i386/reloc.c
libexec/rtld-elf/rtld.c
libexec/rtld-elf/rtld.h
sys/cpu/i386/include/tls.h
sys/i386/include/tls.h

index 9622545..0786e30 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/lib/libc/gen/tls.c,v 1.7 2005/03/01 23:42:00 davidxu Exp $
- *     $DragonFly: src/lib/libc/gen/tls.c,v 1.5 2005/03/29 19:26:19 joerg Exp $
+ *     $DragonFly: src/lib/libc/gen/tls.c,v 1.6 2005/03/29 23:04:36 joerg Exp $
  */
 
 /*
@@ -52,9 +52,8 @@ __weak_reference(___libc_tls_get_addr, ___tls_get_addr);
 #endif
 __weak_reference(__libc_tls_get_addr, __tls_get_addr);
 
-struct tls_tcb *__libc_allocate_tls(struct tls_tcb *old_tcb, size_t tcbsize,
-                                   int flags);
-void __libc_free_tls(struct tls_tcb *tcb, size_t tcb_size);
+struct tls_tcb *__libc_allocate_tls(struct tls_tcb *old_tcb);
+void __libc_free_tls(struct tls_tcb *tcb);
 
 #if !defined(RTLD_STATIC_TLS_VARIANT_II)
 #error "Unsupported TLS layout"
@@ -99,7 +98,7 @@ __libc_tls_get_addr(void *ti __unused)
  * Free Static TLS
  */
 void
-__libc_free_tls(struct tls_tcb *tcb, size_t tcb_size __unused)
+__libc_free_tls(struct tls_tcb *tcb)
 {
        size_t data_size;
 
@@ -114,7 +113,7 @@ __libc_free_tls(struct tls_tcb *tcb, size_t tcb_size __unused)
  * Allocate Static TLS.
  */
 struct tls_tcb *
-__libc_allocate_tls(struct tls_tcb *old_tcb, size_t tcb_size, int flags)
+__libc_allocate_tls(struct tls_tcb *old_tcb)
 {
        size_t data_size;
        struct tls_tcb *tcb;
@@ -122,7 +121,7 @@ __libc_allocate_tls(struct tls_tcb *old_tcb, size_t tcb_size, int flags)
 
        data_size = (tls_static_space + RTLD_STATIC_TLS_ALIGN_MASK) &
                    ~RTLD_STATIC_TLS_ALIGN_MASK;
-       tcb = malloc(data_size + tcb_size);
+       tcb = malloc(data_size + sizeof(*tcb));
        tcb = (struct tls_tcb *)((char *)tcb + data_size);
        dtv = malloc(3 * sizeof(Elf_Addr));
 
@@ -148,7 +147,7 @@ __libc_allocate_tls(struct tls_tcb *old_tcb, size_t tcb_size, int flags)
                 * We assume that this block was the one we created with
                 * allocate_initial_tls().
                 */
-               _rtld_free_tls(old_tcb, sizeof(struct tls_tcb));
+               _rtld_free_tls(old_tcb);
        } else {
                memcpy((char *)tcb - tls_static_space,
                        tls_init, tls_init_size);
@@ -161,14 +160,13 @@ __libc_allocate_tls(struct tls_tcb *old_tcb, size_t tcb_size, int flags)
 #else
 
 struct tls_tcb *
-__libc_allocate_tls(struct tls_tcb *old_tls __unused, size_t tcb_size __unused,
-                       int flags __unused)
+__libc_allocate_tls(struct tls_tcb *old_tls __unused)
 {
        return (0);
 }
 
 void
-__libc_free_tls(struct tls_tcb *tcb __unused, size_t tcb_size __unused)
+__libc_free_tls(struct tls_tcb *tcb __unused)
 {
 }
 
@@ -221,7 +219,7 @@ _init_tls()
        }
 
        if (tls_static_space) {
-               tcb = _rtld_allocate_tls(NULL, sizeof(struct tls_tcb), 0);
+               tcb = _rtld_allocate_tls(NULL);
                tls_set_tcb(tcb);
        }
 #endif
index 46919f1..ba6be93 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/arch/amd64/amd64/pthread_md.c,v 1.4 2004/11/06 03:33:19 peter Exp $
- * $DragonFly: src/lib/libthread_xu/arch/amd64/amd64/pthread_md.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
+ * $DragonFly: src/lib/libthread_xu/arch/amd64/amd64/pthread_md.c,v 1.4 2005/03/29 23:04:36 joerg Exp $
  */
 
 #include <stdlib.h>
@@ -50,12 +50,10 @@ _tcb_ctor(struct pthread *thread, int initial)
                 * level libc startup code
                 */
                struct tls_info info;
-               if (sys_get_tls_area(0, &info, sizeof(info)) == 0) {
+               if (sys_get_tls_area(0, &info, sizeof(info)) == 0)
                        old_tcb = info.base;
-                       flags = RTLD_ALLOC_TLS_FREE_OLD;
-               }
        }
-       tcb = _rtld_allocate_tls(old_tcb, sizeof(struct tcb), flags);
+       tcb = _rtld_allocate_tls(old_tcb);
        if (tcb)
                tcb->tcb_pthread = thread;
 
@@ -65,5 +63,5 @@ _tcb_ctor(struct pthread *thread, int initial)
 void
 _tcb_dtor(struct tls_tcb *tcb)
 {
-       _rtld_free_tls(tcb, sizeof(struct tcb));
+       _rtld_free_tls(tcb);
 }
index 39a92b7..15e318c 100644 (file)
@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libthread_xu/arch/i386/i386/pthread_md.c,v 1.6 2005/03/29 19:26:20 joerg Exp $
+ * $DragonFly: src/lib/libthread_xu/arch/i386/i386/pthread_md.c,v 1.7 2005/03/29 23:04:36 joerg Exp $
  */
 
 #include <sys/types.h>
@@ -51,12 +51,10 @@ _tcb_ctor(struct pthread *thread, int initial)
                 * level libc startup code
                 */
                struct tls_info info;
-               if (sys_get_tls_area(0, &info, sizeof(info)) == 0) {
+               if (sys_get_tls_area(0, &info, sizeof(info)) == 0)
                        old_tcb = info.base;
-                       flags = RTLD_ALLOC_TLS_FREE_OLD;
-               }
        }
-       tcb = _rtld_allocate_tls(old_tcb, sizeof(*tcb), flags);
+       tcb = _rtld_allocate_tls(old_tcb);
 
        if (tcb)
                tcb->tcb_pthread = thread;
@@ -67,5 +65,5 @@ _tcb_ctor(struct pthread *thread, int initial)
 void
 _tcb_dtor(struct tls_tcb *tcb)
 {
-       _rtld_free_tls(tcb, sizeof(*tcb));
+       _rtld_free_tls(tcb);
 }
index e8a524e..f6f5840 100644 (file)
@@ -23,7 +23,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/libexec/rtld-elf/i386/reloc.c,v 1.6.2.2 2002/06/16 20:02:09 dillon Exp $
- * $DragonFly: src/libexec/rtld-elf/i386/reloc.c,v 1.6 2005/03/29 19:26:20 joerg Exp $
+ * $DragonFly: src/libexec/rtld-elf/i386/reloc.c,v 1.7 2005/03/29 23:04:36 joerg Exp $
  */
 
 /*
@@ -329,7 +329,6 @@ allocate_initial_tls(Obj_Entry *objs)
 {
     struct tls_tcb *old_tcb;
     struct tls_info ti;
-    int flags;
     void *tls;
 
     /*
@@ -345,12 +344,10 @@ allocate_initial_tls(Obj_Entry *objs)
     if (tls_static_space) {
        if (sys_get_tls_area(0, &ti, sizeof(ti)) == 0) {
                old_tcb = ti.base;
-               flags = RTLD_ALLOC_TLS_FREE_OLD;
        } else {
                old_tcb = NULL;
-               flags = 0;
        }
-       tls = allocate_tls(objs, old_tcb, sizeof(struct tls_tcb), flags);
+       tls = allocate_tls(objs, old_tcb);
        tls_set_tcb(tls);
     }
 }
index 6b129aa..5bbc3b7 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/libexec/rtld-elf/rtld.c,v 1.43.2.15 2003/02/20 20:42:46 kan Exp $
- * $DragonFly: src/libexec/rtld-elf/rtld.c,v 1.20 2005/03/29 19:26:20 joerg Exp $
+ * $DragonFly: src/libexec/rtld-elf/rtld.c,v 1.21 2005/03/29 23:04:36 joerg Exp $
  */
 
 /*
@@ -2615,12 +2615,10 @@ tls_get_addr_common(void **dtvp, int index, size_t offset)
  * static area is based on negative offsets relative to the tcb.
  */
 struct tls_tcb *
-allocate_tls(Obj_Entry *objs, struct tls_tcb *old_tcb, 
-               size_t tcb_size, int flags)
+allocate_tls(Obj_Entry *objs, struct tls_tcb *old_tcb)
 {
     Obj_Entry *obj;
     size_t data_size;
-    size_t full_size;
     size_t dtv_size;
     struct tls_tcb *tcb;
     Elf_Addr *dtv, *old_dtv;
@@ -2631,11 +2629,9 @@ allocate_tls(Obj_Entry *objs, struct tls_tcb *old_tcb,
      * Allocate the new TCB.  static TLS storage is placed just before the
      * TCB to support the %gs:OFFSET (negative offset) model.
      */
-    assert(tcb_size >= 2*sizeof(Elf_Addr));
     data_size = (tls_static_space + RTLD_STATIC_TLS_ALIGN_MASK) &
                ~RTLD_STATIC_TLS_ALIGN_MASK;
-    full_size = data_size + tcb_size;
-    tcb = malloc(full_size);
+    tcb = malloc(data_size + sizeof(*tcb));
     tcb = (void *)((char *)tcb + data_size);   /* actual tcb location */
 
     dtv_size = (tls_max_index + 2) * sizeof(Elf_Addr);
@@ -2674,8 +2670,7 @@ allocate_tls(Obj_Entry *objs, struct tls_tcb *old_tcb,
                old_dtv[i + 2] = 0;
            }
        }
-       if (flags & RTLD_ALLOC_TLS_FREE_OLD)
-           free_tls(old_tcb, tcb_size);
+       free_tls(old_tcb);
     } else {
        for (obj = objs; obj; obj = obj->next) {
            if (obj->tlsoffset) {
@@ -2692,7 +2687,7 @@ allocate_tls(Obj_Entry *objs, struct tls_tcb *old_tcb,
 }
 
 void
-free_tls(struct tls_tcb *tcb, size_t tcb_size)
+free_tls(struct tls_tcb *tcb)
 {
     Elf_Addr *dtv;
     int dtv_size, i;
@@ -2799,22 +2794,22 @@ free_tls_offset(Obj_Entry *obj)
 }
 
 struct tls_tcb *
-_rtld_allocate_tls(struct tls_tcb *old_tcb, size_t tcb_size, int flags)
+_rtld_allocate_tls(struct tls_tcb *old_tcb)
 {
     struct tls_tcb *new_tcb;
 
     wlock_acquire();
-    new_tcb = allocate_tls(obj_list, old_tcb, tcb_size, flags);
+    new_tcb = allocate_tls(obj_list, old_tcb);
     wlock_release();
 
     return (new_tcb);
 }
 
 void
-_rtld_free_tls(struct tls_tcb *tcb, size_t tcb_size)
+_rtld_free_tls(struct tls_tcb *tcb)
 {
     wlock_acquire();
-    free_tls(tcb, tcb_size);
+    free_tls(tcb);
     wlock_release();
 }
 
index c4567cc..b80e7fe 100644 (file)
@@ -23,7 +23,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/libexec/rtld-elf/rtld.h,v 1.15.2.6 2003/02/20 20:42:46 kan Exp $
- * $DragonFly: src/libexec/rtld-elf/rtld.h,v 1.8 2005/03/28 03:33:17 dillon Exp $
+ * $DragonFly: src/libexec/rtld-elf/rtld.h,v 1.9 2005/03/29 23:04:36 joerg Exp $
  */
 
 #ifndef RTLD_H /* { */
@@ -226,8 +226,8 @@ const Elf_Sym *symlook_obj(const char *, unsigned long,
   const Obj_Entry *, bool);
 
 void *tls_get_addr_common(void **dtvp, int index, size_t offset);
-struct tls_tcb *allocate_tls(Obj_Entry *, struct tls_tcb *, size_t, int);
-void free_tls(struct tls_tcb *, size_t);
+struct tls_tcb *allocate_tls(Obj_Entry *, struct tls_tcb *);
+void free_tls(struct tls_tcb *);
 void *allocate_module_tls(int index);
 bool allocate_tls_offset(Obj_Entry *obj);
 void free_tls_offset(Obj_Entry *obj);
index e29c27c..513e107 100644 (file)
@@ -28,7 +28,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/cpu/i386/include/tls.h,v 1.1 2005/03/29 19:26:20 joerg Exp $
+ * $DragonFly: src/sys/cpu/i386/include/tls.h,v 1.2 2005/03/29 23:04:36 joerg Exp $
  */
 
 #ifndef        _MACHINE_TLS_H_
@@ -100,12 +100,7 @@ tls_set_tcb(struct tls_tcb *tcb)
        __asm __volatile("movl %0, %%gs" : : "r" (seg));
 }
 
-/*
- * flags for _rtld_allocate_tls() and allocate_tls()
- */
-#define RTLD_ALLOC_TLS_FREE_OLD                0x0001
-
-struct tls_tcb *_rtld_allocate_tls(struct tls_tcb *, size_t, int);
-void            _rtld_free_tls(struct tls_tcb *, size_t);
+struct tls_tcb *_rtld_allocate_tls(struct tls_tcb *);
+void            _rtld_free_tls(struct tls_tcb *);
 
 #endif /* !_MACHINE_TLS_H_ */
index 5030c02..03f5f5d 100644 (file)
@@ -28,7 +28,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/i386/include/Attic/tls.h,v 1.1 2005/03/29 19:26:20 joerg Exp $
+ * $DragonFly: src/sys/i386/include/Attic/tls.h,v 1.2 2005/03/29 23:04:36 joerg Exp $
  */
 
 #ifndef        _MACHINE_TLS_H_
@@ -100,12 +100,7 @@ tls_set_tcb(struct tls_tcb *tcb)
        __asm __volatile("movl %0, %%gs" : : "r" (seg));
 }
 
-/*
- * flags for _rtld_allocate_tls() and allocate_tls()
- */
-#define RTLD_ALLOC_TLS_FREE_OLD                0x0001
-
-struct tls_tcb *_rtld_allocate_tls(struct tls_tcb *, size_t, int);
-void            _rtld_free_tls(struct tls_tcb *, size_t);
+struct tls_tcb *_rtld_allocate_tls(struct tls_tcb *);
+void            _rtld_free_tls(struct tls_tcb *);
 
 #endif /* !_MACHINE_TLS_H_ */