From: Nobuyoshi Nakada Date: 2008-09-08T10:46:45+09:00 Subject: [ruby-dev:36205] Re: [Bug #466] test_str_crypt(TestM17NComb) failed なかだです。 At Sun, 7 Sep 2008 12:39:11 +0900, Kazuhiro NISHIYAMA wrote in [ruby-dev:36193]: > 以下のようにconfigureでチェックしてしまうのがいいかと思ったのですが、 > どうでしょうか? > > 影響範囲がよくわからなかったので、実際に値が変わってしまうことがあった > darwinの時だけチェックするようなパッチにしてみました。 現在のライブラリではたまたま毎回結果が変わっていますが、つねにそ うなるとは限らないのではないでしょうか。毎回同じ正しくない結果を 返すという可能性もあるわけで。 "$1"や"$2"で始まるsaltでアルゴリズムを選択するという拡張機能のあ るシステムもありますが、8bit目を使った拡張というのはないと思われ ます。 Index: string.c =================================================================== --- string.c (revision 19215) +++ string.c (working copy) @@ -5862,8 +5862,7 @@ rb_str_crypt(VALUE str, VALUE salt) extern char *crypt(const char *, const char *); VALUE result; - const char *s; + const char *s, *saltp; #ifdef BROKEN_CRYPT - VALUE salt_8bit_clean; - rb_encoding *enc; + char salt_8bit_clean[3]; #endif @@ -5872,18 +5871,14 @@ rb_str_crypt(VALUE str, VALUE salt) rb_raise(rb_eArgError, "salt too short (need >=2 bytes)"); - if (RSTRING_PTR(str)) s = RSTRING_PTR(str); - else s = ""; -#ifdef BROKEN_CRYPT - salt_8bit_clean = rb_str_dup(salt); - enc = rb_ascii8bit_encoding(); - str_modifiable(salt_8bit_clean); - rb_enc_associate(salt_8bit_clean, enc); - salt_8bit_clean = rb_str_tr(salt_8bit_clean, - rb_enc_str_new("\x80-\xFF", 3, enc), - rb_usascii_str_new("\x00-\x7F", 3)); - result = rb_str_new2(crypt(s, RSTRING_PTR(salt_8bit_clean))); -#else - result = rb_str_new2(crypt(s, RSTRING_PTR(salt))); -#endif + s = RSTRING_PTR(str); + if (!s) s = ""; + saltp = RSTRING_PTR(salt); + if (!ISASCII((unsigned char)saltp[0]) || !ISASCII((unsigned char)saltp[1])) { + salt_8bit_clean[0] = saltp[0] & 0x7f; + salt_8bit_clean[1] = saltp[2] & 0x7f; + salt_8bit_clean[2] = '\0'; + saltp = salt_8bit_clean; + } + result = rb_str_new2(crypt(s, salts)); OBJ_INFECT(result, str); OBJ_INFECT(result, salt); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦