mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-09-22 11:30:01 +08:00
[rt-smart] handling kernel from accessing unmapped user stack (#6957)
[rt-smart] handling kernel from accessing unmapped user stack
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user