提交 6468fc9e 编写于 作者: R Rich Felker

check for invalid handles in dlsym/dlclose

this is wasteful and useless from a standpoint of sane programs, but
it is required by the standard, and the current requirements were
upheld with the closure of Austin Group issue #639:
http://austingroupbugs.net/view.php?id=639
上级 d84923d8
...@@ -1091,6 +1091,15 @@ end: ...@@ -1091,6 +1091,15 @@ end:
return p; return p;
} }
static int invalid_dso_handle(struct dso *h)
{
struct dso *p;
for (p=head; p; p=p->next) if (h==p) return 0;
snprintf(errbuf, sizeof errbuf, "Invalid library handle %p", (void *)h);
errflag = 1;
return 1;
}
static void *do_dlsym(struct dso *p, const char *s, void *ra) static void *do_dlsym(struct dso *p, const char *s, void *ra)
{ {
size_t i; size_t i;
...@@ -1110,6 +1119,7 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra) ...@@ -1110,6 +1119,7 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra)
return __tls_get_addr((size_t []){def.dso->tls_id, def.sym->st_value}); return __tls_get_addr((size_t []){def.dso->tls_id, def.sym->st_value});
return def.dso->base + def.sym->st_value; return def.dso->base + def.sym->st_value;
} }
if (invalid_dso_handle(p)) return 0;
if (p->ghashtab) { if (p->ghashtab) {
gh = gnu_hash(s); gh = gnu_hash(s);
sym = gnu_lookup(s, gh, p); sym = gnu_lookup(s, gh, p);
...@@ -1236,6 +1246,12 @@ int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void ...@@ -1236,6 +1246,12 @@ int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void
return ret; return ret;
} }
#else #else
static int invalid_dso_handle(struct dso *h)
{
snprintf(errbuf, sizeof errbuf, "Invalid library handle %p", (void *)h);
errflag = 1;
return 1;
}
void *dlopen(const char *file, int mode) void *dlopen(const char *file, int mode)
{ {
return 0; return 0;
...@@ -1259,5 +1275,5 @@ char *dlerror() ...@@ -1259,5 +1275,5 @@ char *dlerror()
int dlclose(void *p) int dlclose(void *p)
{ {
return 0; return invalid_dso_handle(p);
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册