summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorDoug Rabson <dfr@FreeBSD.org>2005-04-01 19:06:56 +0000
committerDoug Rabson <dfr@FreeBSD.org>2005-04-01 19:06:56 +0000
commit9da76180f34a7ee69d91f956c97ceea65c19a27f (patch)
tree5f78c567edb7d660ca762c330365d1b35ec25e8b /libexec
parentfdbf9af58302056e79f9c049e2fd3c7968a7d02d (diff)
Notes
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/rtld.c12
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]);
}
}