@@ -1400,14 +1400,47 @@ struct kcore_copy_info {
1400
1400
u64 first_module ;
1401
1401
u64 last_module_symbol ;
1402
1402
size_t phnum ;
1403
- struct phdr_data kernel_map ;
1404
- struct phdr_data modules_map ;
1405
1403
struct list_head phdrs ;
1406
1404
};
1407
1405
1408
1406
#define kcore_copy__for_each_phdr (k , p ) \
1409
1407
list_for_each_entry((p), &(k)->phdrs, node)
1410
1408
1409
+ static struct phdr_data * phdr_data__new (u64 addr , u64 len , off_t offset )
1410
+ {
1411
+ struct phdr_data * p = zalloc (sizeof (* p ));
1412
+
1413
+ if (p ) {
1414
+ p -> addr = addr ;
1415
+ p -> len = len ;
1416
+ p -> offset = offset ;
1417
+ }
1418
+
1419
+ return p ;
1420
+ }
1421
+
1422
+ static struct phdr_data * kcore_copy_info__addnew (struct kcore_copy_info * kci ,
1423
+ u64 addr , u64 len ,
1424
+ off_t offset )
1425
+ {
1426
+ struct phdr_data * p = phdr_data__new (addr , len , offset );
1427
+
1428
+ if (p )
1429
+ list_add_tail (& p -> node , & kci -> phdrs );
1430
+
1431
+ return p ;
1432
+ }
1433
+
1434
+ static void kcore_copy__free_phdrs (struct kcore_copy_info * kci )
1435
+ {
1436
+ struct phdr_data * p , * tmp ;
1437
+
1438
+ list_for_each_entry_safe (p , tmp , & kci -> phdrs , node ) {
1439
+ list_del (& p -> node );
1440
+ free (p );
1441
+ }
1442
+ }
1443
+
1411
1444
static int kcore_copy__process_kallsyms (void * arg , const char * name , char type ,
1412
1445
u64 start )
1413
1446
{
@@ -1487,27 +1520,31 @@ static int kcore_copy__parse_modules(struct kcore_copy_info *kci,
1487
1520
return 0 ;
1488
1521
}
1489
1522
1490
- static void kcore_copy__map (struct phdr_data * p , u64 start , u64 end , u64 pgoff ,
1491
- u64 s , u64 e )
1523
+ static int kcore_copy__map (struct kcore_copy_info * kci , u64 start , u64 end ,
1524
+ u64 pgoff , u64 s , u64 e )
1492
1525
{
1493
- if (p -> addr || s < start || s >= end )
1494
- return ;
1526
+ u64 len , offset ;
1527
+
1528
+ if (s < start || s >= end )
1529
+ return 0 ;
1495
1530
1496
- p -> addr = s ;
1497
- p -> offset = (s - start ) + pgoff ;
1498
- p -> len = e < end ? e - s : end - s ;
1531
+ offset = (s - start ) + pgoff ;
1532
+ len = e < end ? e - s : end - s ;
1533
+
1534
+ return kcore_copy_info__addnew (kci , s , len , offset ) ? 0 : -1 ;
1499
1535
}
1500
1536
1501
1537
static int kcore_copy__read_map (u64 start , u64 len , u64 pgoff , void * data )
1502
1538
{
1503
1539
struct kcore_copy_info * kci = data ;
1504
1540
u64 end = start + len ;
1505
1541
1506
- kcore_copy__map (& kci -> kernel_map , start , end , pgoff , kci -> stext ,
1507
- kci -> etext ) ;
1542
+ if ( kcore_copy__map (kci , start , end , pgoff , kci -> stext , kci -> etext ))
1543
+ return -1 ;
1508
1544
1509
- kcore_copy__map (& kci -> modules_map , start , end , pgoff , kci -> first_module ,
1510
- kci -> last_module_symbol );
1545
+ if (kcore_copy__map (kci , start , end , pgoff , kci -> first_module ,
1546
+ kci -> last_module_symbol ))
1547
+ return -1 ;
1511
1548
1512
1549
return 0 ;
1513
1550
}
@@ -1517,11 +1554,6 @@ static int kcore_copy__read_maps(struct kcore_copy_info *kci, Elf *elf)
1517
1554
if (elf_read_maps (elf , true, kcore_copy__read_map , kci ) < 0 )
1518
1555
return -1 ;
1519
1556
1520
- if (kci -> kernel_map .len )
1521
- list_add_tail (& kci -> kernel_map .node , & kci -> phdrs );
1522
- if (kci -> modules_map .len )
1523
- list_add_tail (& kci -> modules_map .node , & kci -> phdrs );
1524
-
1525
1557
return 0 ;
1526
1558
}
1527
1559
@@ -1773,6 +1805,8 @@ int kcore_copy(const char *from_dir, const char *to_dir)
1773
1805
if (err )
1774
1806
kcore_copy__unlink (to_dir , "kallsyms" );
1775
1807
1808
+ kcore_copy__free_phdrs (& kci );
1809
+
1776
1810
return err ;
1777
1811
}
1778
1812
0 commit comments