Browse Source

Bug 1553: Connecting through tunnel to IPv6 does not work

https://winscp.net/tracker/1553

Source commit: cf640973aeff818f6d61ed7b23f9e92d53e8d5a3
Martin Prikryl 8 years ago
parent
commit
dee7e44444
3 changed files with 15 additions and 3 deletions
  1. 7 2
      source/core/SessionData.cpp
  2. 2 0
      source/core/SessionData.h
  3. 6 1
      source/core/Terminal.cpp

+ 7 - 2
source/core/SessionData.cpp

@@ -2734,7 +2734,7 @@ UnicodeString __fastcall TSessionData::GetProtocolUrl()
   return Url;
 }
 //---------------------------------------------------------------------
-static bool __fastcall IsIPv6Literal(const UnicodeString & HostName)
+bool __fastcall IsIPv6Literal(const UnicodeString & HostName)
 {
   bool Result = (HostName.Pos(L":") > 0);
   if (Result)
@@ -2748,6 +2748,11 @@ static bool __fastcall IsIPv6Literal(const UnicodeString & HostName)
   return Result;
 }
 //---------------------------------------------------------------------
+UnicodeString __fastcall EscapeIPv6Literal(const UnicodeString & IP)
+{
+  return L"[" + IP + L"]";
+}
+//---------------------------------------------------------------------
 UnicodeString __fastcall TSessionData::GenerateSessionUrl(unsigned int Flags)
 {
   UnicodeString Url;
@@ -2781,7 +2786,7 @@ UnicodeString __fastcall TSessionData::GenerateSessionUrl(unsigned int Flags)
   DebugAssert(!HostNameExpanded.IsEmpty());
   if (IsIPv6Literal(HostNameExpanded))
   {
-    Url += L"[" + HostNameExpanded + L"]";
+    Url += EscapeIPv6Literal(HostNameExpanded);
   }
   else
   {

+ 2 - 0
source/core/SessionData.h

@@ -687,5 +687,7 @@ private:
 UnicodeString GetExpandedLogFileName(UnicodeString LogFileName, TDateTime Started, TSessionData * SessionData);
 bool __fastcall IsSshProtocol(TFSProtocol FSProtocol);
 int __fastcall DefaultPort(TFSProtocol FSProtocol, TFtps Ftps);
+bool __fastcall IsIPv6Literal(const UnicodeString & HostName);
+UnicodeString __fastcall EscapeIPv6Literal(const UnicodeString & IP);
 //---------------------------------------------------------------------------
 #endif

+ 6 - 1
source/core/Terminal.cpp

@@ -1493,8 +1493,13 @@ void __fastcall TTerminal::OpenTunnel()
     FTunnelData->UserName = FSessionData->TunnelUserName;
     FTunnelData->Password = FSessionData->TunnelPassword;
     FTunnelData->PublicKeyFile = FSessionData->TunnelPublicKeyFile;
+    UnicodeString HostName = FSessionData->HostNameExpanded;
+    if (IsIPv6Literal(HostName))
+    {
+      HostName = EscapeIPv6Literal(HostName);
+    }
     FTunnelData->TunnelPortFwd = FORMAT(L"L%d\t%s:%d",
-      (FTunnelLocalPortNumber, FSessionData->HostNameExpanded, FSessionData->PortNumber));
+      (FTunnelLocalPortNumber, HostName, FSessionData->PortNumber));
     FTunnelData->HostKey = FSessionData->TunnelHostKey;
 
     // inherit proxy options on the main session