diff options
| author | Doug Rabson <dfr@FreeBSD.org> | 2005-04-01 19:06:56 +0000 |
|---|---|---|
| committer | Doug Rabson <dfr@FreeBSD.org> | 2005-04-01 19:06:56 +0000 |
| commit | 9da76180f34a7ee69d91f956c97ceea65c19a27f (patch) | |
| tree | 5f78c567edb7d660ca762c330365d1b35ec25e8b /libexec | |
| parent | fdbf9af58302056e79f9c049e2fd3c7968a7d02d (diff) | |
Notes
Diffstat (limited to 'libexec')
| -rw-r--r-- | libexec/rtld-elf/rtld.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index a487a636d816..995420b3f60f 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -2553,7 +2553,7 @@ allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign) size = tls_static_space; tls = malloc(size); - dtv = malloc((tls_max_index + 2) * sizeof(Elf_Addr)); + dtv = calloc(1, (tls_max_index + 2) * sizeof(Elf_Addr)); *(Elf_Addr**) tls = dtv; @@ -2594,8 +2594,6 @@ allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign) memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize); dtv[obj->tlsindex + 1] = addr; - } else if (obj->tlsindex) { - dtv[obj->tlsindex + 1] = 0; } } } @@ -2622,7 +2620,7 @@ free_tls(void *tls, size_t tcbsize, size_t tcbalign) tlsstart = (Elf_Addr) tls; tlsend = tlsstart + size; for (i = 0; i < dtvsize; i++) { - if (dtv[i+2] < tlsstart || dtv[i+2] > tlsend) { + if (dtv[i+2] && (dtv[i+2] < tlsstart || dtv[i+2] > tlsend)) { free((void*) dtv[i+2]); } } @@ -2651,7 +2649,7 @@ allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign) assert(tcbsize >= 2*sizeof(Elf_Addr)); tls = malloc(size + tcbsize); - dtv = malloc((tls_max_index + 2) * sizeof(Elf_Addr)); + dtv = calloc(1, (tls_max_index + 2) * sizeof(Elf_Addr)); segbase = (Elf_Addr)(tls + size); ((Elf_Addr*)segbase)[0] = segbase; @@ -2695,8 +2693,6 @@ allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign) if (obj->tlsinit) memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize); dtv[obj->tlsindex + 1] = addr; - } else if (obj->tlsindex) { - dtv[obj->tlsindex + 1] = 0; } } } @@ -2723,7 +2719,7 @@ free_tls(void *tls, size_t tcbsize, size_t tcbalign) tlsend = (Elf_Addr) tls; tlsstart = tlsend - size; for (i = 0; i < dtvsize; i++) { - if (dtv[i+2] < tlsstart || dtv[i+2] > tlsend) { + if (dtv[i+2] && (dtv[i+2] < tlsstart || dtv[i+2] > tlsend)) { free((void*) dtv[i+2]); } } |
