Skip to content

Commit abe5739

Browse files
fix(lwp): reject wrapped user copy ranges
1 parent 2529550 commit abe5739

File tree

1 file changed

+34
-17
lines changed

1 file changed

+34
-17
lines changed

components/lwp/lwp_user_mm.c

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -672,21 +672,46 @@ void *lwp_mremap(struct rt_lwp *lwp, void *old_address, size_t old_size,
672672
return rt_aspace_mremap_range(lwp->aspace, old_address, old_size, new_size, flags, new_address);
673673
}
674674

675-
size_t lwp_get_from_user(void *dst, void *src, size_t size)
675+
static rt_bool_t _lwp_user_range_is_valid(const void *addr, size_t size)
676676
{
677-
struct rt_lwp *lwp = RT_NULL;
677+
uintptr_t start;
678+
uintptr_t end;
678679

679-
/* check src */
680+
if (addr == RT_NULL)
681+
{
682+
return RT_FALSE;
683+
}
680684

681-
if (src < (void *)USER_VADDR_START)
685+
start = (uintptr_t)addr;
686+
if (start < (uintptr_t)USER_VADDR_START)
682687
{
683-
return 0;
688+
return RT_FALSE;
684689
}
685-
if (src >= (void *)USER_VADDR_TOP)
690+
if (start >= (uintptr_t)USER_VADDR_TOP)
686691
{
687-
return 0;
692+
return RT_FALSE;
693+
}
694+
695+
end = start + size;
696+
if (end < start)
697+
{
698+
return RT_FALSE;
688699
}
689-
if ((void *)((char *)src + size) > (void *)USER_VADDR_TOP)
700+
if (end > (uintptr_t)USER_VADDR_TOP)
701+
{
702+
return RT_FALSE;
703+
}
704+
705+
return RT_TRUE;
706+
}
707+
708+
size_t lwp_get_from_user(void *dst, void *src, size_t size)
709+
{
710+
struct rt_lwp *lwp = RT_NULL;
711+
712+
/* check src */
713+
714+
if (!_lwp_user_range_is_valid(src, size))
690715
{
691716
return 0;
692717
}
@@ -705,15 +730,7 @@ size_t lwp_put_to_user(void *dst, void *src, size_t size)
705730
struct rt_lwp *lwp = RT_NULL;
706731

707732
/* check dst */
708-
if (dst < (void *)USER_VADDR_START)
709-
{
710-
return 0;
711-
}
712-
if (dst >= (void *)USER_VADDR_TOP)
713-
{
714-
return 0;
715-
}
716-
if ((void *)((char *)dst + size) > (void *)USER_VADDR_TOP)
733+
if (!_lwp_user_range_is_valid(dst, size))
717734
{
718735
return 0;
719736
}

0 commit comments

Comments
 (0)