@@ -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