@@ -1214,6 +1214,18 @@ static int do_add_counters(struct net *net, const void __user *user,
1214
1214
}
1215
1215
1216
1216
#ifdef CONFIG_COMPAT
1217
+ struct compat_arpt_replace {
1218
+ char name [XT_TABLE_MAXNAMELEN ];
1219
+ u32 valid_hooks ;
1220
+ u32 num_entries ;
1221
+ u32 size ;
1222
+ u32 hook_entry [NF_ARP_NUMHOOKS ];
1223
+ u32 underflow [NF_ARP_NUMHOOKS ];
1224
+ u32 num_counters ;
1225
+ compat_uptr_t counters ;
1226
+ struct compat_arpt_entry entries [0 ];
1227
+ };
1228
+
1217
1229
static inline void compat_release_entry (struct compat_arpt_entry * e )
1218
1230
{
1219
1231
struct xt_entry_target * t ;
@@ -1229,8 +1241,7 @@ check_compat_entry_size_and_hooks(struct compat_arpt_entry *e,
1229
1241
const unsigned char * base ,
1230
1242
const unsigned char * limit ,
1231
1243
const unsigned int * hook_entries ,
1232
- const unsigned int * underflows ,
1233
- const char * name )
1244
+ const unsigned int * underflows )
1234
1245
{
1235
1246
struct xt_entry_target * t ;
1236
1247
struct xt_target * target ;
@@ -1301,7 +1312,7 @@ check_compat_entry_size_and_hooks(struct compat_arpt_entry *e,
1301
1312
1302
1313
static int
1303
1314
compat_copy_entry_from_user (struct compat_arpt_entry * e , void * * dstptr ,
1304
- unsigned int * size , const char * name ,
1315
+ unsigned int * size ,
1305
1316
struct xt_table_info * newinfo , unsigned char * base )
1306
1317
{
1307
1318
struct xt_entry_target * t ;
@@ -1334,14 +1345,9 @@ compat_copy_entry_from_user(struct compat_arpt_entry *e, void **dstptr,
1334
1345
return ret ;
1335
1346
}
1336
1347
1337
- static int translate_compat_table (const char * name ,
1338
- unsigned int valid_hooks ,
1339
- struct xt_table_info * * pinfo ,
1348
+ static int translate_compat_table (struct xt_table_info * * pinfo ,
1340
1349
void * * pentry0 ,
1341
- unsigned int total_size ,
1342
- unsigned int number ,
1343
- unsigned int * hook_entries ,
1344
- unsigned int * underflows )
1350
+ const struct compat_arpt_replace * compatr )
1345
1351
{
1346
1352
unsigned int i , j ;
1347
1353
struct xt_table_info * newinfo , * info ;
@@ -1353,8 +1359,8 @@ static int translate_compat_table(const char *name,
1353
1359
1354
1360
info = * pinfo ;
1355
1361
entry0 = * pentry0 ;
1356
- size = total_size ;
1357
- info -> number = number ;
1362
+ size = compatr -> size ;
1363
+ info -> number = compatr -> num_entries ;
1358
1364
1359
1365
/* Init all hooks to impossible value. */
1360
1366
for (i = 0 ; i < NF_ARP_NUMHOOKS ; i ++ ) {
@@ -1365,40 +1371,39 @@ static int translate_compat_table(const char *name,
1365
1371
duprintf ("translate_compat_table: size %u\n" , info -> size );
1366
1372
j = 0 ;
1367
1373
xt_compat_lock (NFPROTO_ARP );
1368
- xt_compat_init_offsets (NFPROTO_ARP , number );
1374
+ xt_compat_init_offsets (NFPROTO_ARP , compatr -> num_entries );
1369
1375
/* Walk through entries, checking offsets. */
1370
- xt_entry_foreach (iter0 , entry0 , total_size ) {
1376
+ xt_entry_foreach (iter0 , entry0 , compatr -> size ) {
1371
1377
ret = check_compat_entry_size_and_hooks (iter0 , info , & size ,
1372
1378
entry0 ,
1373
- entry0 + total_size ,
1374
- hook_entries ,
1375
- underflows ,
1376
- name );
1379
+ entry0 + compatr -> size ,
1380
+ compatr -> hook_entry ,
1381
+ compatr -> underflow );
1377
1382
if (ret != 0 )
1378
1383
goto out_unlock ;
1379
1384
++ j ;
1380
1385
}
1381
1386
1382
1387
ret = - EINVAL ;
1383
- if (j != number ) {
1388
+ if (j != compatr -> num_entries ) {
1384
1389
duprintf ("translate_compat_table: %u not %u entries\n" ,
1385
- j , number );
1390
+ j , compatr -> num_entries );
1386
1391
goto out_unlock ;
1387
1392
}
1388
1393
1389
1394
/* Check hooks all assigned */
1390
1395
for (i = 0 ; i < NF_ARP_NUMHOOKS ; i ++ ) {
1391
1396
/* Only hooks which are valid */
1392
- if (!(valid_hooks & (1 << i )))
1397
+ if (!(compatr -> valid_hooks & (1 << i )))
1393
1398
continue ;
1394
1399
if (info -> hook_entry [i ] == 0xFFFFFFFF ) {
1395
1400
duprintf ("Invalid hook entry %u %u\n" ,
1396
- i , hook_entries [i ]);
1401
+ i , info -> hook_entry [i ]);
1397
1402
goto out_unlock ;
1398
1403
}
1399
1404
if (info -> underflow [i ] == 0xFFFFFFFF ) {
1400
1405
duprintf ("Invalid underflow %u %u\n" ,
1401
- i , underflows [i ]);
1406
+ i , info -> underflow [i ]);
1402
1407
goto out_unlock ;
1403
1408
}
1404
1409
}
@@ -1408,17 +1413,17 @@ static int translate_compat_table(const char *name,
1408
1413
if (!newinfo )
1409
1414
goto out_unlock ;
1410
1415
1411
- newinfo -> number = number ;
1416
+ newinfo -> number = compatr -> num_entries ;
1412
1417
for (i = 0 ; i < NF_ARP_NUMHOOKS ; i ++ ) {
1413
1418
newinfo -> hook_entry [i ] = info -> hook_entry [i ];
1414
1419
newinfo -> underflow [i ] = info -> underflow [i ];
1415
1420
}
1416
1421
entry1 = newinfo -> entries ;
1417
1422
pos = entry1 ;
1418
- size = total_size ;
1419
- xt_entry_foreach (iter0 , entry0 , total_size ) {
1423
+ size = compatr -> size ;
1424
+ xt_entry_foreach (iter0 , entry0 , compatr -> size ) {
1420
1425
ret = compat_copy_entry_from_user (iter0 , & pos , & size ,
1421
- name , newinfo , entry1 );
1426
+ newinfo , entry1 );
1422
1427
if (ret != 0 )
1423
1428
break ;
1424
1429
}
@@ -1428,7 +1433,7 @@ static int translate_compat_table(const char *name,
1428
1433
goto free_newinfo ;
1429
1434
1430
1435
ret = - ELOOP ;
1431
- if (!mark_source_chains (newinfo , valid_hooks , entry1 ))
1436
+ if (!mark_source_chains (newinfo , compatr -> valid_hooks , entry1 ))
1432
1437
goto free_newinfo ;
1433
1438
1434
1439
i = 0 ;
@@ -1439,7 +1444,7 @@ static int translate_compat_table(const char *name,
1439
1444
break ;
1440
1445
}
1441
1446
1442
- ret = check_target (iter1 , name );
1447
+ ret = check_target (iter1 , compatr -> name );
1443
1448
if (ret != 0 ) {
1444
1449
xt_percpu_counter_free (iter1 -> counters .pcnt );
1445
1450
break ;
@@ -1481,7 +1486,7 @@ static int translate_compat_table(const char *name,
1481
1486
free_newinfo :
1482
1487
xt_free_table_info (newinfo );
1483
1488
out :
1484
- xt_entry_foreach (iter0 , entry0 , total_size ) {
1489
+ xt_entry_foreach (iter0 , entry0 , compatr -> size ) {
1485
1490
if (j -- == 0 )
1486
1491
break ;
1487
1492
compat_release_entry (iter0 );
@@ -1493,18 +1498,6 @@ static int translate_compat_table(const char *name,
1493
1498
goto out ;
1494
1499
}
1495
1500
1496
- struct compat_arpt_replace {
1497
- char name [XT_TABLE_MAXNAMELEN ];
1498
- u32 valid_hooks ;
1499
- u32 num_entries ;
1500
- u32 size ;
1501
- u32 hook_entry [NF_ARP_NUMHOOKS ];
1502
- u32 underflow [NF_ARP_NUMHOOKS ];
1503
- u32 num_counters ;
1504
- compat_uptr_t counters ;
1505
- struct compat_arpt_entry entries [0 ];
1506
- };
1507
-
1508
1501
static int compat_do_replace (struct net * net , void __user * user ,
1509
1502
unsigned int len )
1510
1503
{
@@ -1537,10 +1530,7 @@ static int compat_do_replace(struct net *net, void __user *user,
1537
1530
goto free_newinfo ;
1538
1531
}
1539
1532
1540
- ret = translate_compat_table (tmp .name , tmp .valid_hooks ,
1541
- & newinfo , & loc_cpu_entry , tmp .size ,
1542
- tmp .num_entries , tmp .hook_entry ,
1543
- tmp .underflow );
1533
+ ret = translate_compat_table (& newinfo , & loc_cpu_entry , & tmp );
1544
1534
if (ret != 0 )
1545
1535
goto free_newinfo ;
1546
1536
0 commit comments