@@ -1900,6 +1900,23 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
1900
1900
mmap_read_unlock (mm );
1901
1901
}
1902
1902
1903
+ static int get_compat_pages_array (const void __user * chunk_pages [],
1904
+ const void __user * __user * pages ,
1905
+ unsigned long chunk_nr )
1906
+ {
1907
+ compat_uptr_t __user * pages32 = (compat_uptr_t __user * )pages ;
1908
+ compat_uptr_t p ;
1909
+ int i ;
1910
+
1911
+ for (i = 0 ; i < chunk_nr ; i ++ ) {
1912
+ if (get_user (p , pages32 + i ))
1913
+ return - EFAULT ;
1914
+ chunk_pages [i ] = compat_ptr (p );
1915
+ }
1916
+
1917
+ return 0 ;
1918
+ }
1919
+
1903
1920
/*
1904
1921
* Determine the nodes of a user array of pages and store it in
1905
1922
* a user array of status.
@@ -1919,8 +1936,15 @@ static int do_pages_stat(struct mm_struct *mm, unsigned long nr_pages,
1919
1936
if (chunk_nr > DO_PAGES_STAT_CHUNK_NR )
1920
1937
chunk_nr = DO_PAGES_STAT_CHUNK_NR ;
1921
1938
1922
- if (copy_from_user (chunk_pages , pages , chunk_nr * sizeof (* chunk_pages )))
1923
- break ;
1939
+ if (in_compat_syscall ()) {
1940
+ if (get_compat_pages_array (chunk_pages , pages ,
1941
+ chunk_nr ))
1942
+ break ;
1943
+ } else {
1944
+ if (copy_from_user (chunk_pages , pages ,
1945
+ chunk_nr * sizeof (* chunk_pages )))
1946
+ break ;
1947
+ }
1924
1948
1925
1949
do_pages_stat_array (mm , chunk_nr , chunk_pages , chunk_status );
1926
1950
@@ -2025,23 +2049,14 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
2025
2049
2026
2050
#ifdef CONFIG_COMPAT
2027
2051
COMPAT_SYSCALL_DEFINE6 (move_pages , pid_t , pid , compat_ulong_t , nr_pages ,
2028
- compat_uptr_t __user * , pages32 ,
2052
+ compat_uptr_t __user * , pages ,
2029
2053
const int __user * , nodes ,
2030
2054
int __user * , status ,
2031
2055
int , flags )
2032
2056
{
2033
- const void __user * __user * pages ;
2034
- int i ;
2035
-
2036
- pages = compat_alloc_user_space (nr_pages * sizeof (void * ));
2037
- for (i = 0 ; i < nr_pages ; i ++ ) {
2038
- compat_uptr_t p ;
2039
-
2040
- if (get_user (p , pages32 + i ) ||
2041
- put_user (compat_ptr (p ), pages + i ))
2042
- return - EFAULT ;
2043
- }
2044
- return kernel_move_pages (pid , nr_pages , pages , nodes , status , flags );
2057
+ return kernel_move_pages (pid , nr_pages ,
2058
+ (const void __user * __user * )pages ,
2059
+ nodes , status , flags );
2045
2060
}
2046
2061
#endif /* CONFIG_COMPAT */
2047
2062
0 commit comments