aboutsummaryrefslogtreecommitdiff
path: root/elf/dl-iteratephdr.c
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2022-09-14 14:04:18 +0100
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2022-10-27 14:46:54 +0100
commitac41cba6b4853b22ce09697dfcfcd901b69f717a (patch)
tree7fa8b70f424705515c1fd417a18e163686abac72 /elf/dl-iteratephdr.c
parent5ea99c81afe66b84460685114e79b95b97c7ba83 (diff)
downloadglibc-ac41cba6b4853b22ce09697dfcfcd901b69f717a.tar
glibc-ac41cba6b4853b22ce09697dfcfcd901b69f717a.tar.gz
glibc-ac41cba6b4853b22ce09697dfcfcd901b69f717a.tar.bz2
glibc-ac41cba6b4853b22ce09697dfcfcd901b69f717a.zip
cheri: elf: make sure dlpi_phdr covers the load segments
In dl_iterate_phdr phdr is the only capability passed to the callback that may be used to derive pointers of the elf module, so ensure it has wide bounds.
Diffstat (limited to 'elf/dl-iteratephdr.c')
-rw-r--r--elf/dl-iteratephdr.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/elf/dl-iteratephdr.c b/elf/dl-iteratephdr.c
index 146850b88a..bd2588fae8 100644
--- a/elf/dl-iteratephdr.c
+++ b/elf/dl-iteratephdr.c
@@ -69,7 +69,12 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
info.dlpi_addr = l->l_real->l_addr;
#endif
info.dlpi_name = l->l_real->l_name;
+#ifdef __CHERI_PURE_CAPABILITY__
+ ElfW(Addr) phdr = (ElfW(Addr)) l->l_real->l_phdr - l->l_real->l_addr;
+ info.dlpi_phdr = (const void *) dl_rx_ptr (l->l_real, phdr);
+#else
info.dlpi_phdr = l->l_real->l_phdr;
+#endif
info.dlpi_phnum = l->l_real->l_phnum;
info.dlpi_adds = GL(dl_load_adds);
info.dlpi_subs = GL(dl_load_adds) - nloaded;