diff options
| author | Shell <[email protected]> | 2023-02-24 14:52:16 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-02-24 14:52:16 +0800 |
| commit | 382e9bcac746b408b5b01ea2f59338428ab203dd (patch) | |
| tree | 448e8692183ad031b57afda6681aaa93caa56df9 /components | |
| parent | 08c2a651360899ca59e90433dfb78579a642fd75 (diff) | |
[rt-smart] handling kernel from accessing unmapped user stack (#6957)
[rt-smart] handling kernel from accessing unmapped user stack
Diffstat (limited to 'components')
| -rw-r--r-- | components/lwp/arch/risc-v/rv64/lwp_gcc.S | 10 | ||||
| -rw-r--r-- | components/lwp/lwp_user_mm.c | 11 |
2 files changed, 17 insertions, 4 deletions
diff --git a/components/lwp/arch/risc-v/rv64/lwp_gcc.S b/components/lwp/arch/risc-v/rv64/lwp_gcc.S index c54726bc45..3977553dbf 100644 --- a/components/lwp/arch/risc-v/rv64/lwp_gcc.S +++ b/components/lwp/arch/risc-v/rv64/lwp_gcc.S @@ -121,6 +121,16 @@ arch_signal_quit: * routine in user stack */ user_do_signal: + /* prefetch ustack to avoid corrupted status in RESTORE/STORE pair below */ + LOAD t0, FRAME_OFF_SP(sp) + addi t1, t0, -CTX_REG_NR * REGBYTES + LOAD t2, (t0) + li t3, -0x1000 +1: + add t0, t0, t3 + LOAD t2, (t0) + bgt t0, t1, 1b + /** restore and backup kernel sp carefully to avoid leaking */ addi t0, sp, CTX_REG_NR * REGBYTES csrw sscratch, t0 diff --git a/components/lwp/lwp_user_mm.c b/components/lwp/lwp_user_mm.c index 3844a3b189..edda62632d 100644 --- a/components/lwp/lwp_user_mm.c +++ b/components/lwp/lwp_user_mm.c @@ -560,9 +560,12 @@ int lwp_user_accessable(void *addr, size_t size) len = size; } tmp_addr = lwp_v2p(lwp, addr_start); - if (!tmp_addr) + if (tmp_addr == ARCH_MAP_FAILED) { - return 0; + if ((rt_ubase_t)addr_start >= USER_STACK_VSTART && (rt_ubase_t)addr_start < USER_STACK_VEND) + tmp_addr = *(void **)addr_start; + else + return 0; } addr_start = (void *)((char *)addr_start + len); size -= len; @@ -596,7 +599,7 @@ size_t lwp_data_get(struct rt_lwp *lwp, void *dst, void *src, size_t size) len = size; } tmp_src = lwp_v2p(lwp, addr_start); - if (!tmp_src) + if (tmp_src == ARCH_MAP_FAILED) { break; } @@ -636,7 +639,7 @@ size_t lwp_data_put(struct rt_lwp *lwp, void *dst, void *src, size_t size) len = size; } tmp_dst = lwp_v2p(lwp, addr_start); - if (!tmp_dst) + if (tmp_dst == ARCH_MAP_FAILED) { break; } |
