@@ -2399,14 +2399,15 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
2399
2399
2400
2400
static int get_compat_pages_array (const void __user * chunk_pages [],
2401
2401
const void __user * __user * pages ,
2402
+ unsigned long chunk_offset ,
2402
2403
unsigned long chunk_nr )
2403
2404
{
2404
2405
compat_uptr_t __user * pages32 = (compat_uptr_t __user * )pages ;
2405
2406
compat_uptr_t p ;
2406
2407
int i ;
2407
2408
2408
2409
for (i = 0 ; i < chunk_nr ; i ++ ) {
2409
- if (get_user (p , pages32 + i ))
2410
+ if (get_user (p , pages32 + chunk_offset + i ))
2410
2411
return - EFAULT ;
2411
2412
chunk_pages [i ] = compat_ptr (p );
2412
2413
}
@@ -2425,27 +2426,28 @@ static int do_pages_stat(struct mm_struct *mm, unsigned long nr_pages,
2425
2426
#define DO_PAGES_STAT_CHUNK_NR 16UL
2426
2427
const void __user * chunk_pages [DO_PAGES_STAT_CHUNK_NR ];
2427
2428
int chunk_status [DO_PAGES_STAT_CHUNK_NR ];
2429
+ unsigned long chunk_offset = 0 ;
2428
2430
2429
2431
while (nr_pages ) {
2430
2432
unsigned long chunk_nr = min (nr_pages , DO_PAGES_STAT_CHUNK_NR );
2431
2433
2432
2434
if (in_compat_syscall ()) {
2433
2435
if (get_compat_pages_array (chunk_pages , pages ,
2434
- chunk_nr ))
2436
+ chunk_offset , chunk_nr ))
2435
2437
break ;
2436
2438
} else {
2437
- if (copy_from_user (chunk_pages , pages ,
2439
+ if (copy_from_user (chunk_pages , pages + chunk_offset ,
2438
2440
chunk_nr * sizeof (* chunk_pages )))
2439
2441
break ;
2440
2442
}
2441
2443
2442
2444
do_pages_stat_array (mm , chunk_nr , chunk_pages , chunk_status );
2443
2445
2444
- if (copy_to_user (status , chunk_status , chunk_nr * sizeof (* status )))
2446
+ if (copy_to_user (status + chunk_offset , chunk_status ,
2447
+ chunk_nr * sizeof (* status )))
2445
2448
break ;
2446
2449
2447
- pages += chunk_nr ;
2448
- status += chunk_nr ;
2450
+ chunk_offset += chunk_nr ;
2449
2451
nr_pages -= chunk_nr ;
2450
2452
}
2451
2453
return nr_pages ? - EFAULT : 0 ;
0 commit comments