@@ -532,7 +532,7 @@ static SOCKET ConnectToTCPServer(struct sockaddr *ServerAddress, sa_family_t Fam
532
532
#ifdef WIN32
533
533
INFO ("TCP connection to %s established. Time consumed : %dms\n" , Type , (int )((clock () - TimeStart ) * 1000 / CLOCKS_PER_SEC ));
534
534
#else
535
- INFO ("TCP connection to %s established. Time consumed : %d.%ds\n" , Type , CONNECT_TIMEOUT - 1 - TimeLimit .tv_sec , 1000000 - TimeLimit .tv_usec );
535
+ INFO ("TCP connection to %s established. Time consumed : %d.%ds\n" , Type , ( int )( CONNECT_TIMEOUT - 1 - TimeLimit .tv_sec ), ( int )( 1000000 - TimeLimit .tv_usec ) );
536
536
#endif
537
537
return TCPSocket ;
538
538
break ;
@@ -546,7 +546,8 @@ static int TCPProxyPreparation(SOCKET Sock, const struct sockaddr *NestedAddress
546
546
char AddressString [LENGTH_OF_IPV6_ADDRESS_ASCII ];
547
547
char NumberOfCharacter ;
548
548
char Port [8 ];
549
- char RecvBuffer [16 ];
549
+ char RecvBuffer [16 ] = {-1 };
550
+ int ret ;
550
551
551
552
if ( Family == AF_INET )
552
553
{
@@ -562,34 +563,38 @@ static int TCPProxyPreparation(SOCKET Sock, const struct sockaddr *NestedAddress
562
563
return -1 ;
563
564
}
564
565
565
- recv (Sock , RecvBuffer , 2 , MSG_NOSIGNAL );
566
+ if ( SocketIsStillReadable (Sock , 10 ) && recv (Sock , RecvBuffer , 2 , MSG_NOSIGNAL ) != 2 )
567
+ {
568
+ return -2 ;
569
+ }
570
+
566
571
if ( RecvBuffer [0 ] != '\x05' || RecvBuffer [1 ] != '\x00' )
567
572
{
568
- return -1 ;
573
+ return -3 ;
569
574
}
570
575
571
576
if ( send (Sock , "\x05\x01\x00\x03" , 4 , 0 ) != 4 )
572
577
{
573
- return -1 ;
578
+ return -4 ;
574
579
}
575
580
NumberOfCharacter = strlen (AddressString );
576
581
if ( send (Sock , & NumberOfCharacter , 1 , 0 ) != 1 )
577
582
{
578
- return -1 ;
583
+ return -5 ;
579
584
}
580
585
if ( send (Sock , AddressString , NumberOfCharacter , 0 ) != NumberOfCharacter )
581
586
{
582
- return -1 ;
587
+ return -6 ;
583
588
}
584
589
if ( send (Sock , Port , strlen (Port ), 0 ) != strlen (Port ) )
585
590
{
586
- return -1 ;
591
+ return -7 ;
587
592
}
588
593
589
594
recv (Sock , RecvBuffer , 4 , MSG_NOSIGNAL );
590
595
if ( RecvBuffer [1 ] != '\x00' )
591
596
{
592
- return -1 ;
597
+ return -8 ;
593
598
}
594
599
595
600
switch ( RecvBuffer [3 ] )
@@ -723,6 +728,7 @@ int QueryDNSViaTCP(void)
723
728
} else {
724
729
struct sockaddr * NewProxy ;
725
730
sa_family_t ProxyFamily ;
731
+ int ret ;
726
732
727
733
NewProxy = AddressList_GetOne (TCPProxies , & ProxyFamily );
728
734
TCPQueryOutcomeSocket = ConnectToTCPServer (NewProxy , ProxyFamily , "TCP proxy" );
@@ -1303,7 +1309,7 @@ int SetSocketNonBlock(SOCKET sock, BOOL NonBlocked)
1303
1309
BlockFlag = ~O_NONBLOCK ;
1304
1310
}
1305
1311
1306
- if ( fcntl (sock , F_SETFL , Flags | O_NONBLOCK ) < 0 )
1312
+ if ( fcntl (sock , F_SETFL , Flags | BlockFlag ) < 0 )
1307
1313
{
1308
1314
return -1 ;
1309
1315
}
0 commit comments