|
|
Message-ID: <6a42ca4b6c9b4ea08925e232d7b57667@sap.com>
Date: Tue, 3 Apr 2018 13:06:09 +0000
From: "Siebenborn, Axel" <axel.siebenborn@....com>
To: "musl@...ts.openwall.com" <musl@...ts.openwall.com>
Subject: [PATCH] dl_addr: compare addr with sym->st_size.
Hi,
this patch fixes a problem with dl_addr.
We found symbols, in cases we should not find a symbol, since the comparison with sym->st_size is missing.
According to the spec, dl_addr should not return an error in this case. Instead dli_sname and dli_addr should be set to NULL.
Regards,
Axel
diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index 9bf6924..cc87dc0 100644
--- a/ldso/dynlink.c
+++ b/ldso/dynlink.c
@@ -1958,7 +1958,7 @@ int dladdr(const void *addr, Dl_info *info)
&& (1<<(sym->st_info&0xf) & OK_TYPES)
&& (1<<(sym->st_info>>4) & OK_BINDS)) {
void *symaddr = laddr(p, sym->st_value);
- if (symaddr > addr || symaddr < best)
+ if (symaddr > addr || (void*) ((uint8_t*) symaddr + sym->st_size) < addr || symaddr < best)
continue;
best = symaddr;
bestsym = sym;
@@ -1967,13 +1967,16 @@ int dladdr(const void *addr, Dl_info *info)
}
}
- if (!best) return 0;
-
- if (DL_FDPIC && (bestsym->st_info&0xf) == STT_FUNC)
- best = p->funcdescs + (bestsym - p->syms);
-
info->dli_fname = p->name;
info->dli_fbase = p->map;
+ if (!best) {
+ info->dli_sname = 0;
+ info->dli_saddr = 0;
+ return 0
+ }
+
+ if ( DL_FDPIC && (bestsym->st_info&0xf) == STT_FUNC)
+ best = p->funcdescs + (bestsym - p->syms);
info->dli_sname = strings + bestsym->st_name;
info->dli_saddr = best;
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.