mirror of
https://github.com/fluencelabs/musl
synced 2025-04-25 07:12:15 +00:00
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.
This commit is contained in:
parent
27b3fd68f6
commit
1f53e7d00c
@ -10,3 +10,5 @@ static inline struct pthread *__pthread_self()
|
|||||||
#define MC_PC gregs[REG_RIP]
|
#define MC_PC gregs[REG_RIP]
|
||||||
|
|
||||||
#define CANARY canary2
|
#define CANARY canary2
|
||||||
|
|
||||||
|
#define tls_mod_off_t unsigned long long
|
||||||
|
@ -1257,7 +1257,7 @@ void __init_tls(size_t *auxv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((__visibility__("hidden")))
|
__attribute__((__visibility__("hidden")))
|
||||||
void *__tls_get_new(size_t *v)
|
void *__tls_get_new(tls_mod_off_t *v)
|
||||||
{
|
{
|
||||||
pthread_t self = __pthread_self();
|
pthread_t self = __pthread_self();
|
||||||
|
|
||||||
@ -1769,7 +1769,7 @@ static void *addr2dso(size_t a)
|
|||||||
return 0;
|
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)
|
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);
|
struct symdef def = find_sym(p, s, 0);
|
||||||
if (!def.sym) goto failed;
|
if (!def.sym) goto failed;
|
||||||
if ((def.sym->st_info&0xf) == STT_TLS)
|
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)
|
if (DL_FDPIC && (def.sym->st_info&0xf) == STT_FUNC)
|
||||||
return def.dso->funcdescs + (def.sym - def.dso->syms);
|
return def.dso->funcdescs + (def.sym - def.dso->syms);
|
||||||
return laddr(def.dso, def.sym->st_value);
|
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);
|
sym = sysv_lookup(s, h, p);
|
||||||
}
|
}
|
||||||
if (sym && (sym->st_info&0xf) == STT_TLS)
|
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)
|
if (DL_FDPIC && sym && sym->st_shndx && (sym->st_info&0xf) == STT_FUNC)
|
||||||
return p->funcdescs + (sym - p->syms);
|
return p->funcdescs + (sym - p->syms);
|
||||||
if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
|
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]);
|
sym = sysv_lookup(s, h, p->deps[i]);
|
||||||
}
|
}
|
||||||
if (sym && (sym->st_info&0xf) == STT_TLS)
|
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)
|
if (DL_FDPIC && sym && sym->st_shndx && (sym->st_info&0xf) == STT_FUNC)
|
||||||
return p->deps[i]->funcdescs + (sym - p->deps[i]->syms);
|
return p->deps[i]->funcdescs + (sym - p->deps[i]->syms);
|
||||||
if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
|
if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
|
||||||
|
@ -97,6 +97,10 @@ struct __timer {
|
|||||||
#define DTP_OFFSET 0
|
#define DTP_OFFSET 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef tls_mod_off_t
|
||||||
|
#define tls_mod_off_t size_t
|
||||||
|
#endif
|
||||||
|
|
||||||
#define SIGTIMER 32
|
#define SIGTIMER 32
|
||||||
#define SIGCANCEL 33
|
#define SIGCANCEL 33
|
||||||
#define SIGSYNCCALL 34
|
#define SIGSYNCCALL 34
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
#include "libc.h"
|
#include "libc.h"
|
||||||
|
|
||||||
__attribute__((__visibility__("hidden")))
|
__attribute__((__visibility__("hidden")))
|
||||||
void *__tls_get_new(size_t *);
|
void *__tls_get_new(tls_mod_off_t *);
|
||||||
|
|
||||||
void *__tls_get_addr(size_t *v)
|
void *__tls_get_addr(tls_mod_off_t *v)
|
||||||
{
|
{
|
||||||
pthread_t self = __pthread_self();
|
pthread_t self = __pthread_self();
|
||||||
if (v[0]<=(size_t)self->dtv[0])
|
if (v[0]<=(size_t)self->dtv[0])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user