[Ttssh2-commit] [4350] 以下の条件を満たしている時に、接続後すぐに切断されるのを修正した。

アーカイブの一覧に戻る

svnno****@sourc***** svnno****@sourc*****
2011年 2月 28日 (月) 17:12:35 JST


Revision: 4350
          http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=4350
Author:   doda
Date:     2011-02-28 17:12:35 +0900 (Mon, 28 Feb 2011)

Log Message:
-----------
以下の条件を満たしている時に、接続後すぐに切断されるのを修正した。
・ローカル PC で IPv6 を有効にしている
・プロキシサーバが IPv6 アドレスを持たない
・プロトコルに UNSPEC を指定

# プロトコルが UNSPEC の時にプロキシの名前解決を 2 度行ってしまうが、とりあえず妥協。(キャッシュに期待)
# 変更箇所が大きくなりそうなので、4.69 が出てから対処を考えます。

Modified Paths:
--------------
    trunk/TTProxy/ProxyWSockHook.h


-------------- next part --------------
Modified: trunk/TTProxy/ProxyWSockHook.h
===================================================================
--- trunk/TTProxy/ProxyWSockHook.h	2011-02-28 07:22:11 UTC (rev 4349)
+++ trunk/TTProxy/ProxyWSockHook.h	2011-02-28 08:12:35 UTC (rev 4350)
@@ -487,7 +487,10 @@
           fillBuffer(buffer, bufferLength, "ssh", AF_UNSPEC);
         }
         void fillBuffer(char* buffer, int bufferLength, const char *portname, int addr_family) {
-            struct servent *sv;
+            struct servent* sv;
+            struct addrinfo* res;
+            struct addrinfo* res0;
+            struct addrinfo hints;
             int portnum = 0;
             if (sv = getservbyname(portname, "tcp")) {
               portnum = sv->s_port;
@@ -545,8 +548,41 @@
                     break;
                 case AF_UNSPEC:
                 default:
-                    dst->ainfo[0].ai_next = &dst->ainfo[1];
-                    dst->ai = &dst->ainfo[0];
+                    memset(&hints, 0, sizeof hints);
+                    getaddrinfo(proxy.host, NULL, &hints, &res0);
+                    if (res0) {
+                        int flag = 0;
+                        for (res = res0; res; res = res->ai_next) {
+                            switch (res->ai_family) {
+                            case AF_INET6:
+                                flag |= 1;
+                                break;
+                            case AF_INET:
+                                flag |= 2;
+                                break;
+                            }
+                            if (flag == 3)
+                                break;
+                        }
+                        switch (flag) {
+                        case 1:
+                            dst->ai = &dst->ainfo[0];
+                            break;
+                        case 2:
+                            dst->ai = &dst->ainfo[1];
+                            break;
+                        case 3:
+                        default:
+                            dst->ainfo[0].ai_next = &dst->ainfo[1];
+                            dst->ai = &dst->ainfo[0];
+                            break;
+                        }
+                        freeaddrinfo(res0);
+                    }
+                    else {
+                        dst->ainfo[0].ai_next = &dst->ainfo[1];
+                        dst->ai = &dst->ainfo[0];
+                    }
                     break;
             }
 



Ttssh2-commit メーリングリストの案内
アーカイブの一覧に戻る