From 52604968e665b996e9b6cbaf1dba6941611167e7 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Sat, 6 Mar 2021 14:16:32 +0800 Subject: [PATCH 1/3] =?UTF-8?q?sys=5Fpipe=E5=8A=A0=E5=85=A5=E8=AE=BF?= =?UTF-8?q?=E9=97=AE=E5=AE=89=E5=85=A8=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp_syscall.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 08d837be16..1b29b689e6 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -2662,6 +2662,11 @@ int sys_access(const char *filename, int mode) int sys_pipe(int fd[2]) { + if (!lwp_user_accessable((void *)fd, sizeof(int[2]))) + { + rt_set_errno(EINVAL); + return -1; + } return pipe(fd); } -- Gitee From 6b3fff39cf749dc77832dbe5bd067794362ed74d Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Sat, 6 Mar 2021 14:17:40 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=80=81=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=A4=8D=E5=88=B6=E5=87=BD=E6=95=B0=E5=8E=BB=E9=99=A4?= =?UTF-8?q?=E5=86=97=E4=BD=99=E7=9A=84=E5=87=BD=E6=95=B0=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp_user_mm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/lwp/lwp_user_mm.c b/components/lwp/lwp_user_mm.c index be31ab0e54..41d98ddb41 100644 --- a/components/lwp/lwp_user_mm.c +++ b/components/lwp/lwp_user_mm.c @@ -568,7 +568,7 @@ size_t lwp_data_get(rt_mmu_info *mmu_info, void *dst, void *src, size_t size) { break; } - tmp_src = (void *)((char *)rt_hw_mmu_v2p(mmu_info, addr_start) - PV_OFFSET); + tmp_src = (void *)((char *)tmp_src - PV_OFFSET); rt_memcpy(tmp_dst, tmp_src, len); tmp_dst = (void *)((char *)tmp_dst + len); addr_start = (void *)((char *)addr_start + len); @@ -607,7 +607,7 @@ size_t lwp_data_put(rt_mmu_info *mmu_info, void *dst, void *src, size_t size) { break; } - tmp_dst = (void *)((char *)rt_hw_mmu_v2p(mmu_info, addr_start) - PV_OFFSET); + tmp_dst = (void *)((char *)tmp_dst - PV_OFFSET); rt_memcpy(tmp_dst, tmp_src, len); tmp_src = (void *)((char *)tmp_src + len); addr_start = (void *)((char *)addr_start + len); -- Gitee From 8bee952f13e10ba969dddab745e23d1214f5171c Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Sat, 6 Mar 2021 15:17:01 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=AD=A3load=5Felf=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E6=A0=B9=E6=8D=AEsection=E8=BF=9B=E8=A1=8C=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E6=AD=A4=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E9=9C=80=E8=A6=81=E7=94=A8=E6=88=B7=E6=80=81=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E8=84=9A=E6=9C=AC=E5=90=8C=E6=AD=A5=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp.c | 56 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index 53045d6f1a..3c0312566a 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -373,6 +373,9 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str size_t rel_dyn_size = 0; size_t dynsym_off = 0; size_t dynsym_size = 0; +#ifdef RT_USING_USERSPACE + void *pa, *va; +#endif #ifdef RT_USING_USERSPACE rt_mmu_info *m_info = &lwp->mmu_info; @@ -424,9 +427,6 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str } { /* load aux */ -#ifdef RT_USING_USERSPACE - void *pa, *va; -#endif uint8_t *process_header; size_t process_header_size; @@ -478,6 +478,50 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str #endif } +#ifdef RT_USING_USERSPACE + /* map user */ + off = eheader.e_shoff; + for (i = 0; i < eheader.e_shnum; i++, off += sizeof sheader) + { + int need_map = 0; + int text = 0; + + check_off(off, len); + lseek(fd, off, SEEK_SET); + read_len = load_fread(&sheader, 1, sizeof sheader, fd); + check_read(read_len, sizeof sheader); + + if ((sheader.sh_flags & SHF_ALLOC) == 0) + { + continue; + } + + switch (sheader.sh_type) + { + case SHT_PROGBITS: + if ((sheader.sh_flags & SHF_EXECINSTR) != 0) + { + text = 1; + } + case SHT_NOBITS: + need_map = 1; + break; + default: + break; + } + if (need_map) + { + /* map user */ + va = lwp_map_user(lwp, (void *)sheader.sh_addr, sheader.sh_size, text); + if (!va || (va != (void *)(size_t)sheader.sh_addr)) + { + result = -RT_ERROR; + goto _exit; + } + } + } +#endif + off = eheader.e_phoff; for (i = 0; i < eheader.e_phnum; i++, off += sizeof pheader) { @@ -513,12 +557,8 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str result = -RT_ERROR; goto _exit; } - va = lwp_map_user(lwp, (void *)pheader.p_vaddr, pheader.p_memsz, 1); - } - else - { - va = lwp_map_user(lwp, 0, pheader.p_memsz, 0); } + va = (void *)pheader.p_vaddr; if (va) { lwp->text_entry = va; -- Gitee