@@ -626,7 +626,7 @@ async fn test_std_tcpstream(case: i64) -> std::io::Result<()> { // Result<(), Bo
626
626
627
627
use tokio:: io:: AsyncWriteExt ;
628
628
629
- async fn test_tokio_tcpstream ( ) -> std:: io:: Result < ( ) > {
629
+ async fn test_tokio_tcpstream ( case : i64 ) -> std:: io:: Result < ( ) > {
630
630
// using tokio::io to fetch a web page
631
631
let address = "example.com:80" ;
632
632
@@ -637,18 +637,100 @@ async fn test_tokio_tcpstream() -> std::io::Result<()> {
637
637
// send request
638
638
tokio_stream. write_all ( b"GET / HTTP/1.1\n Host:example.com\n \n " ) . await ?;
639
639
640
+ if case == 1 {
641
+ // peek response
642
+ let mut buffer1 = vec ! [ 0 ; 2 * 1024 ] ;
643
+ let _ = tokio_stream. peek ( & mut buffer1) . await ?; // $ MISSING: Alert[rust/summary/taint-sources]
644
+
645
+ // read response
646
+ let mut buffer2 = vec ! [ 0 ; 2 * 1024 ] ;
647
+ let n2 = tokio_stream. read ( & mut buffer2) . await ?; // $ MISSING: Alert[rust/summary/taint-sources]
648
+
649
+ println ! ( "buffer1 = {:?}" , buffer1) ;
650
+ sink ( & buffer1) ; // $ MISSING: hasTaintFlow
651
+ sink ( buffer1[ 0 ] ) ; // $ MISSING: hasTaintFlow
652
+
653
+ println ! ( "buffer2 = {:?}" , buffer2) ;
654
+ sink ( & buffer2) ; // $ MISSING: hasTaintFlow
655
+ sink ( buffer2[ 0 ] ) ; // $ MISSING: hasTaintFlow
656
+
657
+ let buffer_string = String :: from_utf8_lossy ( & buffer2[ ..n2] ) ;
658
+ println ! ( "string = {}" , buffer_string) ;
659
+ sink ( buffer_string) ; // $ MISSING: hasTaintFlow
660
+ } else if case == 2 {
661
+ let mut buffer = [ 0 ; 2 * 1024 ] ;
662
+ loop {
663
+ match tokio_stream. try_read ( & mut buffer) {
664
+ Ok ( 0 ) => {
665
+ println ! ( "end" ) ;
666
+ break ;
667
+ }
668
+ Ok ( _n) => {
669
+ println ! ( "buffer = {:?}" , buffer) ;
670
+ sink ( & buffer) ; // $ MISSING: hasTaintFlow
671
+ break ; // (or we could wait for more data)
672
+ }
673
+ Err ( ref e) if e. kind ( ) == std:: io:: ErrorKind :: WouldBlock => {
674
+ // wait...
675
+ continue ;
676
+ }
677
+ Err ( e) => {
678
+ println ! ( "error: {}" , e) ;
679
+ break ;
680
+ }
681
+ }
682
+ }
683
+ } else {
684
+ let mut buffer = Vec :: new ( ) ;
685
+ loop {
686
+ match tokio_stream. try_read_buf ( & mut buffer) {
687
+ Ok ( 0 ) => {
688
+ println ! ( "end" ) ;
689
+ break ;
690
+ }
691
+ Ok ( _n) => {
692
+ println ! ( "buffer = {:?}" , buffer) ;
693
+ sink ( & buffer) ; // $ MISSING: hasTaintFlow
694
+ break ; // (or we could wait for more data)
695
+ }
696
+ Err ( ref e) if e. kind ( ) == std:: io:: ErrorKind :: WouldBlock => {
697
+ // wait...
698
+ continue ;
699
+ }
700
+ Err ( e) => {
701
+ println ! ( "error: {}" , e) ;
702
+ break ;
703
+ }
704
+ }
705
+ }
706
+ }
707
+
708
+ Ok ( ( ) )
709
+ }
710
+
711
+ async fn test_std_to_tokio_tcpstream ( ) -> std:: io:: Result < ( ) > {
712
+ // using tokio::io to fetch a web page
713
+ let address = "example.com:80" ;
714
+
715
+ // create the connection
716
+ println ! ( "connecting to {}..." , address) ;
717
+ let std_stream = std:: net:: TcpStream :: connect ( address) ?;
718
+
719
+ // convert to tokio stream
720
+ std_stream. set_nonblocking ( true ) ?;
721
+ let mut tokio_stream = tokio:: net:: TcpStream :: from_std ( std_stream) ?;
722
+
723
+ // send request
724
+ tokio_stream. write_all ( b"GET / HTTP/1.1\n Host:example.com\n \n " ) . await ?;
725
+
640
726
// read response
641
727
let mut buffer = vec ! [ 0 ; 32 * 1024 ] ;
642
- let n = tokio_stream. read ( & mut buffer) . await ?; // $ MISSING: Alert[rust/summary/taint-sources]
728
+ let _n = tokio_stream. read ( & mut buffer) . await ?; // $ MISSING: Alert[rust/summary/taint-sources]
643
729
644
730
println ! ( "data = {:?}" , buffer) ;
645
731
sink ( & buffer) ; // $ MISSING: hasTaintFlow
646
732
sink ( buffer[ 0 ] ) ; // $ MISSING: hasTaintFlow
647
733
648
- let buffer_string = String :: from_utf8_lossy ( & buffer[ ..n] ) ;
649
- println ! ( "string = {}" , buffer_string) ;
650
- sink ( buffer_string) ; // $ MISSING: hasTaintFlow
651
-
652
734
Ok ( ( ) )
653
735
}
654
736
@@ -714,7 +796,13 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
714
796
}
715
797
716
798
println ! ( "test_tokio_tcpstream..." ) ;
717
- match futures:: executor:: block_on ( test_tokio_tcpstream ( ) ) {
799
+ match futures:: executor:: block_on ( test_tokio_tcpstream ( case) ) {
800
+ Ok ( _) => println ! ( "complete" ) ,
801
+ Err ( e) => println ! ( "error: {}" , e) ,
802
+ }
803
+
804
+ println ! ( "test_std_to_tokio_tcpstream..." ) ;
805
+ match futures:: executor:: block_on ( test_std_to_tokio_tcpstream ( ) ) {
718
806
Ok ( _) => println ! ( "complete" ) ,
719
807
Err ( e) => println ! ( "error: {}" , e) ,
720
808
}
0 commit comments