@@ -475,7 +475,7 @@ impl Reader {
475
475
#[ cfg( test) ]
476
476
mod tests {
477
477
use super :: * ;
478
- use std:: ffi :: { c_char , CStr } ;
478
+ use std:: { mem , slice } ;
479
479
480
480
#[ test]
481
481
fn no_tags ( ) {
@@ -581,6 +581,73 @@ mod tests {
581
581
assert ! ( bi. command_line_tag( ) . is_none( ) ) ;
582
582
}
583
583
584
+ #[ test]
585
+ fn custom_tag ( ) {
586
+ const CUSTOM_TAG_ID : u32 = 0x1337 ;
587
+
588
+ #[ repr( C , align( 8 ) ) ]
589
+ struct Bytes ( [ u8 ; 32 ] ) ;
590
+ let bytes: Bytes = Bytes ( [
591
+ 32 ,
592
+ 0 ,
593
+ 0 ,
594
+ 0 , // total_size
595
+ 0 ,
596
+ 0 ,
597
+ 0 ,
598
+ 0 , // reserved
599
+ // my custom tag
600
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 0 ] ,
601
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 1 ] ,
602
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 2 ] ,
603
+ CUSTOM_TAG_ID . to_ne_bytes ( ) [ 3 ] ,
604
+ 13 ,
605
+ 0 ,
606
+ 0 ,
607
+ 0 , // tag size
608
+ 110 ,
609
+ 97 ,
610
+ 109 ,
611
+ 101 , // ASCII string 'name'
612
+ 0 ,
613
+ 0 ,
614
+ 0 ,
615
+ 0 , // null byte + padding
616
+ 0 ,
617
+ 0 ,
618
+ 0 ,
619
+ 0 , // end tag type
620
+ 8 ,
621
+ 0 ,
622
+ 0 ,
623
+ 0 , // end tag size
624
+ ] ) ;
625
+ let addr = bytes. 0 . as_ptr ( ) as usize ;
626
+ let bi = unsafe { load ( addr) } ;
627
+ let bi = bi. unwrap ( ) ;
628
+ assert_eq ! ( addr, bi. start_address( ) ) ;
629
+ assert_eq ! ( addr + bytes. 0 . len( ) , bi. end_address( ) ) ;
630
+ assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) ) ;
631
+
632
+ #[ repr( C , align( 8 ) ) ]
633
+ struct CustomTag {
634
+ tag : SpecifiedOrCustomTagTypeSerialized ,
635
+ size : u32 ,
636
+ name : u8 ,
637
+ }
638
+
639
+ let tag = bi
640
+ . get_tag ( CUSTOM_TAG_ID . into ( ) )
641
+ . unwrap ( )
642
+ . cast_tag :: < CustomTag > ( ) ;
643
+
644
+ // strlen without null byte
645
+ let strlen = tag. size as usize - mem:: size_of :: < CommandLineTag > ( ) ;
646
+ let bytes = unsafe { slice:: from_raw_parts ( ( & tag. name ) as * const u8 , strlen) } ;
647
+ let name = core:: str:: from_utf8 ( bytes) . unwrap ( ) ;
648
+ assert_eq ! ( name, "name" ) ;
649
+ }
650
+
584
651
#[ test]
585
652
/// Compile time test for `BootLoaderNameTag`.
586
653
fn name_tag_size ( ) {
@@ -1362,7 +1429,7 @@ mod tests {
1362
1429
let bi = bi. unwrap ( ) ;
1363
1430
assert_eq ! ( addr, bi. start_address( ) ) ;
1364
1431
assert_eq ! ( addr + bytes. 0 . len( ) , bi. end_address( ) ) ;
1365
- assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) as usize ) ;
1432
+ assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) ) ;
1366
1433
let es = bi. elf_sections_tag ( ) . unwrap ( ) ;
1367
1434
let mut s = es. sections ( ) ;
1368
1435
let s1 = s. next ( ) . unwrap ( ) ;
@@ -1416,7 +1483,7 @@ mod tests {
1416
1483
let bi = bi. unwrap ( ) ;
1417
1484
assert_eq ! ( addr, bi. start_address( ) ) ;
1418
1485
assert_eq ! ( addr + bytes. 0 . len( ) , bi. end_address( ) ) ;
1419
- assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) as usize ) ;
1486
+ assert_eq ! ( bytes. 0 . len( ) , bi. total_size( ) ) ;
1420
1487
let efi_memory_map = bi. efi_memory_map_tag ( ) . unwrap ( ) ;
1421
1488
let mut efi_mmap_iter = efi_memory_map. memory_areas ( ) ;
1422
1489
let desc = efi_mmap_iter. next ( ) . unwrap ( ) ;
0 commit comments