1
1
use std:: fs:: File ;
2
- use std:: io:: { BufRead , BufReader } ;
2
+ use std:: io:: { BufRead , BufReader , StdoutLock , Write } ;
3
3
use std:: path:: { Path , PathBuf } ;
4
4
use std:: process:: ExitCode ;
5
5
use std:: thread:: JoinHandle ;
@@ -577,6 +577,9 @@ fn display_scan_results(res: ScanResult, what: &str, options: &ScanOptions) {
577
577
}
578
578
}
579
579
580
+ // Lock stdout to avoid having multiple threads interlap their writes
581
+ let mut stdout = std:: io:: stdout ( ) . lock ( ) ;
582
+
580
583
// Then, print matching rules.
581
584
for rule in res. matched_rules {
582
585
if let Some ( id) = options. identifier . as_ref ( ) {
@@ -592,70 +595,70 @@ fn display_scan_results(res: ScanResult, what: &str, options: &ScanOptions) {
592
595
593
596
// <rule_namespace>:<rule_name> [<ruletags>] <matched object>
594
597
if options. print_namespace {
595
- print ! ( "{}:" , rule. namespace. unwrap_or( "default" ) ) ;
598
+ write ! ( stdout , "{}:" , rule. namespace. unwrap_or( "default" ) ) . unwrap ( ) ;
596
599
}
597
- print ! ( "{}" , & rule. name) ;
600
+ write ! ( stdout , "{}" , & rule. name) . unwrap ( ) ;
598
601
if options. print_tags {
599
- print ! ( " [{}]" , rule. tags. join( "," ) ) ;
602
+ write ! ( stdout , " [{}]" , rule. tags. join( "," ) ) . unwrap ( ) ;
600
603
}
601
604
if options. print_metadata {
602
- print_metadata ( rule. metadatas ) ;
605
+ print_metadata ( & mut stdout , rule. metadatas ) ;
603
606
}
604
- println ! ( " {}" , what) ;
607
+ writeln ! ( stdout , " {}" , what) . unwrap ( ) ;
605
608
606
609
if options. print_strings_matches ( ) {
607
610
for string in & rule. matches {
608
611
for m in & string. matches {
609
612
// <offset>:<length>:<name>: <match>
610
- print ! ( "0x{:x}:" , m. base + m. offset) ;
613
+ write ! ( stdout , "0x{:x}:" , m. base + m. offset) . unwrap ( ) ;
611
614
if options. print_string_length {
612
- print ! ( "{}:" , m. length) ;
615
+ write ! ( stdout , "{}:" , m. length) . unwrap ( ) ;
613
616
}
614
- print ! ( "${}" , string. name) ;
617
+ write ! ( stdout , "${}" , string. name) . unwrap ( ) ;
615
618
if options. print_strings_matches_data {
616
- print ! ( ": " ) ;
617
- print_bytes ( & m. data ) ;
619
+ write ! ( stdout , ": " ) . unwrap ( ) ;
620
+ print_bytes ( & mut stdout , & m. data ) ;
618
621
}
619
- println ! ( ) ;
622
+ writeln ! ( stdout ) . unwrap ( ) ;
620
623
}
621
624
}
622
625
}
623
626
}
624
627
625
628
// Finally, print the statistics
626
629
if let Some ( stats) = res. statistics {
627
- println ! ( "{}: {:#?}" , what, stats) ;
630
+ writeln ! ( stdout , "{}: {:#?}" , what, stats) . unwrap ( ) ;
628
631
}
629
632
}
630
633
631
- fn print_metadata ( metadatas : & [ Metadata ] ) {
632
- print ! ( " [" ) ;
634
+ fn print_metadata ( stdout : & mut StdoutLock , metadatas : & [ Metadata ] ) {
635
+ write ! ( stdout , " [" ) . unwrap ( ) ;
633
636
for ( i, meta) in metadatas. iter ( ) . enumerate ( ) {
634
637
if i != 0 {
635
- print ! ( "," ) ;
638
+ write ! ( stdout , "," ) . unwrap ( ) ;
636
639
}
637
- print ! ( "{}=" , meta. name) ;
640
+ write ! ( stdout , "{}=" , meta. name) . unwrap ( ) ;
638
641
match & meta. value {
639
642
MetadataValue :: Bytes ( b) => {
640
- print ! ( "\" " ) ;
641
- print_bytes ( b) ;
642
- print ! ( "\" " ) ;
643
+ write ! ( stdout , "\" " ) . unwrap ( ) ;
644
+ print_bytes ( stdout , b) ;
645
+ write ! ( stdout , "\" " ) . unwrap ( ) ;
643
646
}
644
647
MetadataValue :: Integer ( i) => {
645
- print ! ( "{}" , i) ;
648
+ write ! ( stdout , "{}" , i) . unwrap ( ) ;
646
649
}
647
650
MetadataValue :: Boolean ( b) => {
648
- print ! ( "{}" , b) ;
651
+ write ! ( stdout , "{}" , b) . unwrap ( ) ;
649
652
}
650
653
}
651
654
}
652
- print ! ( "]" ) ;
655
+ write ! ( stdout , "]" ) . unwrap ( ) ;
653
656
}
654
657
655
- fn print_bytes ( data : & [ u8 ] ) {
658
+ fn print_bytes ( stdout : & mut StdoutLock , data : & [ u8 ] ) {
656
659
for c in data {
657
660
for b in std:: ascii:: escape_default ( * c) {
658
- print ! ( "{}" , b as char ) ;
661
+ write ! ( stdout , "{}" , b as char ) . unwrap ( ) ;
659
662
}
660
663
}
661
664
}
0 commit comments