diff options
| author | rofl0r <retnyg@gmx.net> | 2017-01-13 10:28:46 +0000 | 
|---|---|---|
| committer | rofl0r <retnyg@gmx.net> | 2017-01-13 10:47:08 +0000 | 
| commit | 1f53e7d00c375efb32e2e468f91a42668653d5f0 (patch) | |
| tree | d349d8718c0819061540cdfd751bb7b7806a30a7 /ldso | |
| parent | 27b3fd68f67b674440d21ea7ca5cf918d2e1559f (diff) | |
| download | musl-1f53e7d00c375efb32e2e468f91a42668653d5f0.tar.gz | |
fix crashes in x32 __tls_get_addr
x32 has another gratuitous difference to all other archs:
it passes an array of 64bit values to __tls_get_addr().
usually it is an array of size_t.
Diffstat (limited to 'ldso')
| -rw-r--r-- | ldso/dynlink.c | 10 | 
1 files changed, 5 insertions, 5 deletions
diff --git a/ldso/dynlink.c b/ldso/dynlink.c index 48dcd1c2..a03f75e3 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -1257,7 +1257,7 @@ void __init_tls(size_t *auxv)  }  __attribute__((__visibility__("hidden"))) -void *__tls_get_new(size_t *v) +void *__tls_get_new(tls_mod_off_t *v)  {  	pthread_t self = __pthread_self(); @@ -1769,7 +1769,7 @@ static void *addr2dso(size_t a)  	return 0;  } -void *__tls_get_addr(size_t *); +void *__tls_get_addr(tls_mod_off_t *);  static void *do_dlsym(struct dso *p, const char *s, void *ra)  { @@ -1787,7 +1787,7 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra)  		struct symdef def = find_sym(p, s, 0);  		if (!def.sym) goto failed;  		if ((def.sym->st_info&0xf) == STT_TLS) -			return __tls_get_addr((size_t []){def.dso->tls_id, def.sym->st_value}); +			return __tls_get_addr((tls_mod_off_t []){def.dso->tls_id, def.sym->st_value});  		if (DL_FDPIC && (def.sym->st_info&0xf) == STT_FUNC)  			return def.dso->funcdescs + (def.sym - def.dso->syms);  		return laddr(def.dso, def.sym->st_value); @@ -1802,7 +1802,7 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra)  		sym = sysv_lookup(s, h, p);  	}  	if (sym && (sym->st_info&0xf) == STT_TLS) -		return __tls_get_addr((size_t []){p->tls_id, sym->st_value}); +		return __tls_get_addr((tls_mod_off_t []){p->tls_id, sym->st_value});  	if (DL_FDPIC && sym && sym->st_shndx && (sym->st_info&0xf) == STT_FUNC)  		return p->funcdescs + (sym - p->syms);  	if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES)) @@ -1816,7 +1816,7 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra)  			sym = sysv_lookup(s, h, p->deps[i]);  		}  		if (sym && (sym->st_info&0xf) == STT_TLS) -			return __tls_get_addr((size_t []){p->deps[i]->tls_id, sym->st_value}); +			return __tls_get_addr((tls_mod_off_t []){p->deps[i]->tls_id, sym->st_value});  		if (DL_FDPIC && sym && sym->st_shndx && (sym->st_info&0xf) == STT_FUNC)  			return p->deps[i]->funcdescs + (sym - p->deps[i]->syms);  		if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))  | 
