@@ -29,18 +29,14 @@ fn main() {
2929 let server = Socks5Server :: new ( port) ;
3030 vmess ( & server, proxy. into ( ) , parse_uid ( user_id) . unwrap ( ) )
3131 } ,
32- _ => {
33- eprint ! ( "{}" , USAGE )
34- } ,
32+ _ => eprint ! ( "{}" , USAGE )
3533 }
3634}
3735
3836fn parse_uid ( x : & str ) -> Option < [ u8 ; 16 ] > {
39- let mut r = [ 0 ; 16 ] ;
4037 let x = x. replace ( '-' , "" ) ;
4138 let list: Vec < _ > = ( 0 ..32 ) . step_by ( 2 ) . map ( |i| u8:: from_str_radix ( & x[ i..i+2 ] , 16 ) . unwrap ( ) ) . collect ( ) ;
42- r. clone_from_slice ( list. get ( 0 ..16 ) ?) ;
43- Some ( r)
39+ list. get ( 0 ..16 ) . map ( |x| [ 0 ; 16 ] . apply ( |buf| buf. copy_from_slice ( x) ) )
4440}
4541
4642fn is_normal_close ( e : & std:: io:: Error ) -> bool {
@@ -51,7 +47,7 @@ fn is_normal_close(e: &std::io::Error) -> bool {
5147}
5248
5349fn vmess ( server : & Socks5Server , proxy : String , user_id : [ u8 ; 16 ] ) {
54- let connect = Box :: leak ( Box :: new ( move |dest, port| {
50+ let connect = leak ( move |dest, port| {
5551 let client = std:: net:: TcpStream :: connect ( & proxy) ?;
5652 debug ! ( "connect {}:{} through proxy" , & dest, port) ;
5753
@@ -63,22 +59,19 @@ fn vmess(server: &Socks5Server, proxy: String, user_id: [u8; 16]) {
6359 let local_port = local. port ( ) ;
6460
6561 Ok ( ( local_addr, local_port, ( dest, port, client) ) )
66- } ) ) ;
62+ } ) ;
6763
6864 #[ allow( non_snake_case) ]
69- let pass = Box :: leak ( Box :: new ( move |( dest, port, conn) : ( Addr , u16 , std:: net:: TcpStream ) , mut stream : std:: net:: TcpStream | {
70- let mut key = [ 0 ; 16 ] ;
71- thread_rng ( ) . fill_bytes ( & mut key) ;
72-
73- let mut IV = [ 0 ; 16 ] ;
74- thread_rng ( ) . fill_bytes ( & mut IV ) ;
65+ let pass = leak ( move |( dest, port, conn) : ( Addr , u16 , std:: net:: TcpStream ) , mut stream : std:: net:: TcpStream | {
66+ let key = [ 0 ; 16 ] . apply ( |x| thread_rng ( ) . fill_bytes ( x) ) ;
67+ let IV = [ 0 ; 16 ] . apply ( |x| thread_rng ( ) . fill_bytes ( x) ) ;
7568
7669 {
7770 let conn = conn. try_clone ( ) . expect ( "failed to clone TCP handle" ) ;
7871 let mut stream = stream. try_clone ( ) . expect ( "failed to clone TCP handle" ) ;
7972
8073 std:: thread:: spawn ( move || {
81- let mut buffer = Box :: new ( unsafe { std :: mem :: uninitialized :: < [ u8 ; 16384 ] > ( ) } ) ;
74+ let mut buffer = Box :: new ( [ 0 ; 16384 ] ) ;
8275 let mut reader = match VmessReader :: new ( conn, key, IV ) {
8376 Some ( x) => x,
8477 None => return warn ! ( "reader handshake failed" )
@@ -88,21 +81,21 @@ fn vmess(server: &Socks5Server, proxy: String, user_id: [u8; 16]) {
8881 Ok ( 0 ) => break ,
8982 Ok ( x) => x,
9083 Err ( ref e) if is_normal_close ( e) => break ,
91- Err ( e) => { error ! ( "{}" , e) ; break }
84+ Err ( e) => { warn ! ( "{}" , e) ; break }
9285 } ;
9386
9487 match stream. write_all ( & buffer[ ..len] ) {
9588 Ok ( _) => debug ! ( "read {} bytes" , len) ,
9689 Err ( ref e) if is_normal_close ( e) => break ,
97- Err ( e) => { error ! ( "{}" , e) ; break }
90+ Err ( e) => { warn ! ( "{}" , e) ; break }
9891 }
9992 }
10093 reader. close ( ) ;
10194 debug ! ( "closed reading" )
10295 } ) ;
10396 }
10497
105- let mut buffer = Box :: new ( unsafe { std :: mem :: uninitialized :: < [ u8 ; 16384 ] > ( ) } ) ;
98+ let mut buffer = Box :: new ( [ 0 ; 16384 ] ) ;
10699 let mut writer = match VmessWriter :: new ( conn, user_id, dest, port, key, IV ) {
107100 Some ( x) => x,
108101 None => return warn ! ( "writer handshake failed" )
@@ -112,19 +105,19 @@ fn vmess(server: &Socks5Server, proxy: String, user_id: [u8; 16]) {
112105 Ok ( 0 ) => break ,
113106 Ok ( x) => x,
114107 Err ( ref e) if is_normal_close ( e) => break ,
115- Err ( e) => { error ! ( "{}" , e) ; break }
108+ Err ( e) => { warn ! ( "{}" , e) ; break }
116109 } ;
117110
118111 match writer. write_all ( & buffer[ ..len] ) {
119112 Ok ( _) => debug ! ( "sent {} bytes" , len) ,
120113 Err ( ref e) if is_normal_close ( e) => break ,
121- Err ( e) => { error ! ( "{}" , e) ; break }
114+ Err ( e) => { warn ! ( "{}" , e) ; break }
122115 }
123116 }
124117
125118 writer. close ( ) ;
126119 debug ! ( "closed writing" ) ;
127- } ) ) ;
120+ } ) ;
128121
129122 server. listen ( connect, pass)
130123}
0 commit comments