Gauche:Bugs

Gauche:Bugs

Gaucheのversionと、できれば日付もいれといて下さい。日付は[[$date]]で入れられます。


MSYS2/MinGW-w64 32bit 開発環境での Gauche のビルド/テストでエラー (0.9.6_pre2)

hamayama(2017/05/07 14:41:57 UTC): 切り分けができていませんが、とりあえず報告しておきます。
MSYS2/MinGW-w64 32bit 開発環境 でのみ現象が発生します。
MSYS2/MinGW-w64 64bit や MinGW.org (32bitのみ) の開発環境では発生しません。
確認した OS は Windows 8.1 (64bit) です。
印象としては、ほとんど動作していて、ごくまれに文字列が化ける感じ。

調査中のメモは、以下に分離しました。
https://gist.github.com/Hamayama/f248c6a8b8e853a49caf58bf1a02399c
(2017/05/09 10:25:44 UTC)

<分かってきたこと>
(1) Gauche v0.9.5 を使って Gauche v0.9.6_pre2 をビルド/テストした場合には発生しない。
(2) (1)で作成した Gauche v0.9.6_pre2 を使って Gauche v0.9.6_pre2 をビルド/テストする際にエラーが出る。
(頻度は、3回ビルド&テストすると1回は出る という程度)
(3) MSYS2/MinGW-w64 32bit の少し古い開発環境 (gcc v6.2.0) でも発生する。

<今後の予定>
git bisect を使って、HEAD と v0.9.5 の間で、現象が発生するようになったコミットを探す。
(時間がかかりそうですが、マイペースですすめてみます。。。)

hamayama(2017/05/11 11:59:20 UTC): どうも、今日は、全然再現しなくなってしまいました。。。
昨日までと違うところというと、Windows Update があったので、PC を1回再起動したことです。
引き続き調べてみます。。。

hamayama(2017/05/13 01:18:27 UTC): 昨日は1回だけ再現しました。頻度が低くなって切り分けが難しい。。。
dllの依存関係もツールで確認したが、問題はなさそう。
これまでのエラーを見ると、いずれもファイルのロードのところで文字化けが起きている。
しかし文字列のテストでは、エラーは発生していない。
シェルもしくはシェルから引数を受け取るところで化ける?

hamayama(2017/05/13 15:54:07 UTC): 再現スクリプトができました。

hamayama(2017/05/14 12:33:10 UTC): しばらくスクリプトを動かしていますが大丈夫っぽいです(今40000カウントくらい)。
対応ありがとうございます。齊藤さんもいつも有用な情報ありがとうございます。
(参考 : GC_MALLOC_ATOMIC 関連
http://wiki.monaos.org/pukiwiki.php?Reading%20Gauche%2Fgauche.h%2FSCM_MALLOC_ATOMIC )

tls-input-port からの読み込みで ERROR: argument out of range: 1 (0.9.5, HEAD)

shinya 2017/01/11 23:26:22 UTC: tls-read が 1byte だけ読むとマズいようです

パッチ:

diff --git a/ext/tls/tls.scm b/ext/tls/tls.scm
index 3d61986..15e3347 100644
--- a/ext/tls/tls.scm
+++ b/ext/tls/tls.scm
@@ -119,15 +119,13 @@
     (set! (~ ip'getb)
           (let ((buf #f) (pos 0) (size 0))
             (^[]
-              (if buf
-                (rlet1 r (string-byte-ref buf pos)
-                  (set! pos (+ pos 1))
-                  (when (= pos size) (set! buf #f)))
-                (begin
-                  (set! buf (tls-read tls))
-                  (set! size (string-size buf))
-                  (set! pos 1)
-                  (string-byte-ref buf 0))))))))
+              (unless buf
+                (set! buf (tls-read tls))
+                (set! size (string-size buf))
+                (set! pos 0))
+              (rlet1 r (string-byte-ref buf pos)
+                (set! pos (+ pos 1))
+                (when (= pos size) (set! buf #f))))))))
 
 (define (make-tls-output-port tls)
   (rlet1 op (make <virtual-output-port>)

Windows で HEAD のビルドエラー (0.9.5)

hamayama(2016/12/13 08:12:57 UTC): Gauche の HEAD (ec3c709) をビルドして、その Gauche でさらに HEAD をビルドすると、以下のエラーが出ます。
リリース版の Gauche v0.9.5 を使ってビルドした場合には発生しません。
lib/gauche/interpolate.scm を見ると、string-interpolate は定義されているようですが。。。
OS: Windows 8.1 (64bit), 開発環境: MSYS2/MinGW-w64

make[2]: ディレクトリ '/c/Gauche/Gauche/ext/util' に入ります
../../src/gosh -ftest ../../src/precomp -e -P -o util--match ../../libsrc/util/match.scm
*** ERROR: Autoloaded symbol string-interpolate is not defined in the module gauche.interpolate
    While loading "../../libsrc/file/util.scm" at line 856
    While compiling "../../lib/gauche/cgen/unit.scm" at line 34: (define-module gauche.cgen.unit (use srfi-13) (use srfi-42) (use util.match) (use file.util) (use gau ...
    While loading "../../lib/gauche/cgen/unit.scm" at line 56
    While compiling "../../lib/gauche/cgen.scm" at line 43: (define-module gauche.cgen (extend gauche.cgen.unit gauche.cgen.literal gauche.cgen.type gauche.cgen. ...
    While loading "../../lib/gauche/cgen.scm" at line 46
    While compiling "../../lib/gauche/cgen/precomp.scm" at line 37: (define-module gauche.cgen.precomp (use srfi-1) (use srfi-13) (use gauche.cgen) (use gauche.cgen.stub ...
    While loading "../../lib/gauche/cgen/precomp.scm" at line 51
    While compiling "./../../src/precomp" at line 40: (use gauche.cgen.precomp)
    While loading "./../../src/precomp" at line 40
Stack Trace:
_______________________________________
make[2]: *** [Makefile:25: util--match.c] エラー 70
make[2]: ディレクトリ '/c/Gauche/Gauche/ext/util' から出ます
make[1]: *** [Makefile:37: util] エラー 2
make[1]: ディレクトリ '/c/Gauche/Gauche/ext' から出ます
make: *** [Makefile:40: all] エラー 1

TLSで接続できないWEBサーバが存在する (0.9.5)

hamayama(2016/10/29 14:44:21 UTC)(2016/10/31 22:03:42 UTC): https://syosetu.org/ に接続しようとすると以下のエラーが発生する件について調べました。

(use rfc.http)
(http-get "syosetu.org" "/" :secure #t)
*** ERROR: TLS handshake failed: -40

これは、axTLS v2.0.1 がサポートする cipher suite と、WEBサーバがサポートする cipher suite に一致するものが存在しないためのようです。
axTLS v2.0.1 がサポートする cipher suite は、以下の4個になります。

TLS_RSA_WITH_AES_128_CBC_SHA (0x2f)
TLS_RSA_WITH_AES_256_CBC_SHA (0x35)
TLS_RSA_WITH_AES_128_CBC_SHA256 (0x3c)
TLS_RSA_WITH_AES_256_CBC_SHA256 (0x3d)

一方、https://syosetu.org/ については、SSL Server Test ( https://www.ssllabs.com/ssltest/index.html ) のページで確認すると、
これらの cipher suite をサポートしていません。
このため、TLS の client hello メッセージに対して、SSL_ALERT_HANDSHAKE_FAILURE (40) が返って、エラーになります。

また、Gauche v0.9.4 の場合には、axTLS v1.4.9 を使用しており、サポートする cipher suite は、以下の4個になります。

TLS_RSA_WITH_AES_128_CBC_SHA (0x2f)
TLS_RSA_WITH_AES_256_CBC_SHA (0x35)
TLS_RSA_WITH_RC4_128_SHA (0x5)
TLS_RSA_WITH_RC4_128_MD5 (0x4)

このうちの TLS_RSA_WITH_RC4_128_SHA (0x5) については、https://syosetu.org/ でもサポートしているため、通信が成功します。
ただし、RC4 は INSECURE とのことで、現在は使用が推奨されていないようです。

今後どうすればよいかですが。。。
基本的には、TLSのライブラリで、

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (0xc028)

のような新しいタイプの cipher suite がサポートされるのがよさそうではあります。
ECDHE は FS (Forward secrecy) という性質を持つ鍵交換プロトコルであり、GCM は 認証付き暗号モードとのことで、
実現が難しいかもしれませんが。。。

あとは、WEBサーバ側に、axTLS v2.0.1 の cipher suite を追加してもらうよう依頼することも考えられます。
ただし、多くのブラウザでは ECDHE 等が使用できるようなので、理由を聞かれるかもしれませんが。。。
(google.com, microsoft.com, www.apple.com 等、多くのサーバは axTLS v2.0.1 の cipher suite をサポートしているのですが。。。)


Last modified : 2017/05/14 22:05:18 UTC