提交 e829695f 编写于 作者: R Rich Felker

avoid using undefined pointer arithmetic in dladdr

上级 a0d64dcc
master OpenHarmony-2.2-Beta2 OpenHarmony-2.3-Beta OpenHarmony-3.0-LTS OpenHarmony-3.1-API8-SDK-Public OpenHarmony-3.1-API9-SDK-Canary OpenHarmony-3.1-Beta OpenHarmony-3.1-Release OpenHarmony-3.2-Beta1 OpenHarmony-3.2-Beta2 OpenHarmony-3.2-Beta3 OpenHarmony-3.2-Beta4 OpenHarmony-3.2-Beta5 OpenHarmony-3.2-Release OpenHarmony-4.0-Beta1 OpenHarmony-4.0-Beta2 OpenHarmony-v2.2-Beta OpenHarmony_1.0.1_release OpenHarmony_filemanager_develop_20220505 OpenHarmony_filemanager_develop_20220614 code_style_fix feature_IDL_20220811 gn-adaptation llvm_1230_release master_dy monthly_20220614 monthly_20220816 monthly_20221018 monthly_20230815 revert-merge-404-master revert-merge-426-master revert-merge-455-master revert-merge-516-master revert-merge-567-master revert-merge-625-master revert-merge-720-master revert-merge-789-master revert-merge-813-master revert-merge-865-master revert-merge-967-master weekly_20220105 weekly_20220111 weekly_20220118 weekly_20220125 weekly_20220201 weekly_20220208 weekly_20220215 weekly_20220222 weekly_20220301 weekly_20220406 weekly_20220412 weekly_20220419 weekly_20220426 weekly_20220503 weekly_20220510 weekly_20220524 weekly_20220531 weekly_20220607 weekly_20220614 weekly_20220621 weekly_20220628 weekly_20220705 weekly_20220712 weekly_20220719 weekly_20220726 weekly_20220802 weekly_20220809 weekly_20220816 weekly_20220823 weekly_20220830 weekly_20220906 weekly_20220913 weekly_20220920 weekly_20220927 weekly_20221004 weekly_20221011 weekly_20221018 weekly_20221025 weekly_20221101 weekly_20221108 weekly_20221115 weekly_20221122 weekly_20221129 weekly_20221206 weekly_20221213 weekly_20221220 weekly_20221227 weekly_20230103 weekly_20230110 weekly_20230117 weekly_20230124 weekly_20230131 weekly_20230207 weekly_20230214 weekly_20230221 weekly_20230228 weekly_20230307 weekly_20230314 weekly_20230321 weekly_20230328 weekly_20230404 weekly_20230411 weekly_20230418 weekly_20230425 weekly_20230502 weekly_20230509 weekly_20230516 weekly_20230523 weekly_20230530 weekly_20230606 weekly_20230613 weekly_20230619 weekly_20230626 weekly_20230627 weekly_20230704 weekly_20230712 weekly_20230725 weekly_20230801 weekly_20230808 weekly_20230815 weekly_20230822 write_optimization_come_back OpenHarmony_v1.1.1-LTS OpenHarmony_release_v1.1.0 OpenHarmony-v4.0-Beta2 OpenHarmony-v4.0-Beta1 OpenHarmony-v3.2.2-Release OpenHarmony-v3.2.1-Release OpenHarmony-v3.2-Release OpenHarmony-v3.2-Beta5 OpenHarmony-v3.2-Beta4 OpenHarmony-v3.2-Beta3 OpenHarmony-v3.2-Beta2 OpenHarmony-v3.2-Beta1 OpenHarmony-v3.1.7-Release OpenHarmony-v3.1.6-Release OpenHarmony-v3.1.5-Release OpenHarmony-v3.1.4-Release OpenHarmony-v3.1.3-Release OpenHarmony-v3.1.2-Release OpenHarmony-v3.1.1-Release OpenHarmony-v3.1-Release OpenHarmony-v3.1-Beta OpenHarmony-v3.0.8-LTS OpenHarmony-v3.0.7-LTS OpenHarmony-v3.0.6-LTS OpenHarmony-v3.0.5-LTS OpenHarmony-v3.0.3-LTS OpenHarmony-v3.0.2-LTS OpenHarmony-v3.0.1-LTS OpenHarmony-v3.0-LTS OpenHarmony-v3.0-Beta1 OpenHarmony-v2.2-Beta2 OpenHarmony-v1.1.5-LTS OpenHarmony-v1.1.4-LTS OpenHarmony-v1.1.3-LTS OpenHarmony-v1.1.2-LTS OpenHarmony-v1.1.1-LTS OpenHarmony-2.0-Canary OpenHarmony-1.0
无相关合并请求
...@@ -1943,16 +1943,17 @@ failed: ...@@ -1943,16 +1943,17 @@ failed:
return 0; return 0;
} }
int dladdr(const void *addr, Dl_info *info) int dladdr(const void *addr_arg, Dl_info *info)
{ {
size_t addr = (size_t)addr_arg;
struct dso *p; struct dso *p;
Sym *sym, *bestsym; Sym *sym, *bestsym;
uint32_t nsym; uint32_t nsym;
char *strings; char *strings;
void *best = 0; size_t best = 0;
pthread_rwlock_rdlock(&lock); pthread_rwlock_rdlock(&lock);
p = addr2dso((size_t)addr); p = addr2dso(addr);
pthread_rwlock_unlock(&lock); pthread_rwlock_unlock(&lock);
if (!p) return 0; if (!p) return 0;
...@@ -1962,10 +1963,10 @@ int dladdr(const void *addr, Dl_info *info) ...@@ -1962,10 +1963,10 @@ int dladdr(const void *addr, Dl_info *info)
nsym = count_syms(p); nsym = count_syms(p);
if (DL_FDPIC) { if (DL_FDPIC) {
size_t idx = ((size_t)addr-(size_t)p->funcdescs) size_t idx = (addr-(size_t)p->funcdescs)
/ sizeof(*p->funcdescs); / sizeof(*p->funcdescs);
if (idx < nsym && (sym[idx].st_info&0xf) == STT_FUNC) { if (idx < nsym && (sym[idx].st_info&0xf) == STT_FUNC) {
best = p->funcdescs + idx; best = (size_t)(p->funcdescs + idx);
bestsym = sym + idx; bestsym = sym + idx;
} }
} }
...@@ -1974,7 +1975,7 @@ int dladdr(const void *addr, Dl_info *info) ...@@ -1974,7 +1975,7 @@ int dladdr(const void *addr, Dl_info *info)
if (sym->st_value if (sym->st_value
&& (1<<(sym->st_info&0xf) & OK_TYPES) && (1<<(sym->st_info&0xf) & OK_TYPES)
&& (1<<(sym->st_info>>4) & OK_BINDS)) { && (1<<(sym->st_info>>4) & OK_BINDS)) {
void *symaddr = laddr(p, sym->st_value); size_t symaddr = (size_t)laddr(p, sym->st_value);
if (symaddr > addr || symaddr < best) if (symaddr > addr || symaddr < best)
continue; continue;
best = symaddr; best = symaddr;
...@@ -1987,12 +1988,12 @@ int dladdr(const void *addr, Dl_info *info) ...@@ -1987,12 +1988,12 @@ int dladdr(const void *addr, Dl_info *info)
if (!best) return 0; if (!best) return 0;
if (DL_FDPIC && (bestsym->st_info&0xf) == STT_FUNC) if (DL_FDPIC && (bestsym->st_info&0xf) == STT_FUNC)
best = p->funcdescs + (bestsym - p->syms); best = (size_t)(p->funcdescs + (bestsym - p->syms));
info->dli_fname = p->name; info->dli_fname = p->name;
info->dli_fbase = p->map; info->dli_fbase = p->map;
info->dli_sname = strings + bestsym->st_name; info->dli_sname = strings + bestsym->st_name;
info->dli_saddr = best; info->dli_saddr = (void *)best;
return 1; return 1;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
新手
引导
客服 返回
顶部