提交 6516282d 编写于 作者: R Rich Felker

fix crash in new dynamic tls installation when last dep lacks tls

code introduced in commit 9d44b646
wrongly assumed the dso list tail was the right place to find new dtv
storage. however, this is only true if the last-loaded dependency has
tls. the correct place to get it is the dso corresponding to the tls
module list tail. introduce a container_of macro to get it, and use
it.

ultimately, dynamic tls allocation should be refactored so that this
is not an issue. there is no reason to be allocating new dtv space at
each load_library; instead it could happen after all new libraries
have been loaded but before they are committed. such changes may be
made later, but this commit fixes the present regression.
上级 ba18c1ec
......@@ -29,6 +29,8 @@ static void error(const char *, ...);
#define MAXP2(a,b) (-(-(a)&-(b)))
#define ALIGN(x,y) ((x)+(y)-1 & -(y))
#define container_of(p,t,m) ((t*)((char *)(p)-offsetof(t,m)))
struct debug {
int ver;
void *head;
......@@ -1356,7 +1358,8 @@ static void install_new_tls(void)
{
sigset_t set;
pthread_t self = __pthread_self(), td;
uintptr_t (*newdtv)[tls_cnt+1] = (void *)tail->new_dtv;
struct dso *dtv_provider = container_of(tls_tail, struct dso, tls);
uintptr_t (*newdtv)[tls_cnt+1] = (void *)dtv_provider->new_dtv;
struct dso *p;
size_t i, j;
size_t old_cnt = self->dtv[0];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册