Bug #466: test_str_crypt(TestM17NComb) failed http://redmine.ruby-lang.org/issues/show/466 $B5/I<<T(B: Kazuhiro NISHIYAMA $B%9%F!<%?%9(B: Open, $BM%@hEY(B: Normal $ ruby-trunk -v ruby 1.9.0 (2008-08-21 revision 18753) [powerpc-darwin9.4.0] $B$N4D6-$G(Btest_str_crypt(TestM17NComb)$B$,(BFailure$B$K$J$j$^$9!#(B $ ruby-trunk test/ruby/test_m17n_comb.rb -v -n /crypt/ Loaded suite test/ruby/test_m17n_comb Started test_str_crypt(TestM17NComb): F Finished in 0.03673 seconds. 1) Failure: test_str_crypt(TestM17NComb) [test/ruby/test_m17n_comb.rb:800:in `block in test_str_crypt' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:83:in `block in each' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:75:in `block in each_index' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:46:in `block in make_large_block' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:26:in `block (2 levels) in make_basic_block' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:21:in `times' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:21:in `block in make_basic_block' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:20:in `times' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:20:in `make_basic_block' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:45:in `make_large_block' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:71:in `each_index' /Users/nishiyamakazuhiro/wc/ruby-lang/trunk/test/ruby/allpairs.rb:82:in `each' test/ruby/test_m17n_comb.rb:118:in `combination' test/ruby/test_m17n_comb.rb:794:in `test_str_crypt']: "".force_encoding("ASCII-8BIT").crypt("\xE0\xA0\xA1".force_encoding("UTF-8")). <"\xE0\xA0fT7zdRv9Y7A"> expected but was <"\xE0\xA0swiH3o6yAu2">. 1 tests, 55 assertions, 1 failures, 0 errors $ $ ruby-trunk -ve '3.times{p "".crypt("\xE0\xA0")}' ruby 1.9.0 (2008-08-21 revision 18753) [powerpc-darwin9.4.0] "\xE0\xA0X8NBuQ4l6uQ" "\xE0\xA0fT7zdRv9Y7A" "\xE0\xA0fT7zdRv9Y7A" $ $B$N$h$&$K(B2$B2sL\0J9_$G7k2L$,0c$&$N$,860x$N$h$&$G$9!#(B $BD>@\(Bcrypt(2)$B$rF1$80z?t$G8F$s$G$bF1$87k2L$K$J$j$^$9!#(B $ cat a.c #include <stdio.h> #include <unistd.h> int main() { printf("%s\n", crypt("", "\xE0\xA0")); printf("%s\n", crypt("", "\xE0\xA0")); printf("%s\n", crypt("", "\xE0\xA0")); return 0; } $ gcc a.c $ ./a.out |LANG=C cat -v M-`M- X8NBuQ4l6uQ M-`M- fT7zdRv9Y7A M-`M- fT7zdRv9Y7A $
on 21.08.2008 13:21
on 03.09.2008 12:02
$B%A%1%C%H(B #466 $B$,99?7$5$l$^$7$?!#(B (by Yui NARUSE) $B%+%F%4%j(B core$B$K%;%C%H(B $BC4Ev<T(B Yui NARUSE$B$+$i(BKazuhiro NISHIYAMA$B$KJQ99(B M17N $B$G$J$/%i%$%V%i%jB&$NLdBj$H$$$&$N$H!"BEEv$J2r7h:v$NH=CG$,$o$?$7$K$O$D$1$i$l$J$$$N$G!"(B $B$H$j$"$($:C4Ev$r@>;3$5$s$KMB$1$^$9!#(B ---------------------------------------- http://redmine.ruby-lang.org/issues/show/466
on 07.09.2008 05:45
$B%A%1%C%H(B #466 $B$,99?7$5$l$^$7$?!#(B (by Kazuhiro NISHIYAMA)
$B0J2<$N$h$&$K(Bconfigure$B$G%A%'%C%/$7$F$7$^$&$N$,$$$$$+$H;W$C$?$N$G$9$,!"(B
$B$I$&$G$7$g$&$+(B?
$B1F6AHO0O$,$h$/$o$+$i$J$+$C$?$N$G!"<B:]$KCM$,JQ$o$C$F$7$^$&$3$H$,$"$C$?(B
darwin$B$N;~$@$1%A%'%C%/$9$k$h$&$J%Q%C%A$K$7$F$_$^$7$?!#(B
Index: configure.in
===================================================================
--- configure.in (revision 19208)
+++ configure.in (working copy)
@@ -523,6 +523,26 @@
AC_DEFINE(BROKEN_SETREUID, 1)
AC_DEFINE(BROKEN_SETREGID, 1)
])
+ ac_cv_lib_crypt_crypt=no
+ AC_CACHE_CHECK(for broken crypt with 8bit chars,
rb_cv_broken_crypt,
+ [AC_TRY_RUN([
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+int
+main()
+{
+ char buf[256];
+ strcpy(buf, crypt("", "\xE0\xA0"));
+ return strcmp(buf, crypt("", "\xE0\xA0"));
+}
+],
+ rb_cv_broken_crypt=no,
+ rb_cv_broken_crypt=yes,
+ rb_cv_broken_crypt=yes)])
+ if test "$rb_cv_broken_crypt" = yes; then
+ AC_DEFINE(BROKEN_CRYPT, 1)
+ fi
;;
hpux*) LIBS="-lm $LIBS"
ac_cv_c_inline=no;;
Index: string.c
===================================================================
--- string.c (revision 19208)
+++ string.c (working copy)
@@ -5862,6 +5862,10 @@
extern char *crypt(const char *, const char *);
VALUE result;
const char *s;
+#ifdef BROKEN_CRYPT
+ VALUE salt_8bit_clean;
+ rb_encoding *enc;
+#endif
StringValue(salt);
if (RSTRING_LEN(salt) < 2)
@@ -5869,7 +5873,18 @@
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
OBJ_INFECT(result, str);
OBJ_INFECT(result, salt);
return result;
----------------------------------------
http://redmine.ruby-lang.org/issues/show/466
on 07.09.2008 06:05
$B$^$D$b$H(B $B$f$-$R$m$G$9(B
In message "Re: [ruby-dev:36193] [Bug #466] test_str_crypt(TestM17NComb)
failed"
on Sun, 7 Sep 2008 12:39:11 +0900, Kazuhiro NISHIYAMA
<redmine@ruby-lang.org> writes:
|$B0J2<$N$h$&$K(Bconfigure$B$G%A%'%C%/$7$F$7$^$&$N$,$$$$$+$H;W$C$?$N$G$9$,!"(B
|$B$I$&$G$7$g$&$+(B?
|
|$B1F6AHO0O$,$h$/$o$+$i$J$+$C$?$N$G!"<B:]$KCM$,JQ$o$C$F$7$^$&$3$H$,$"$C$?(B
|darwin$B$N;~$@$1%A%'%C%/$9$k$h$&$J%Q%C%A$K$7$F$_$^$7$?!#(B
$B%3%_%C%H$7$F$/$@$5$$$^$;$s$+!)(B
on 07.09.2008 11:07
$B%A%1%C%H(B #466 $B$,99?7$5$l$^$7$?!#(B (by Anonymous) $B%9%F!<%?%9(B Open$B$+$i(BClosed$B$KJQ99(B $B?JD=(B % 0$B$+$i(B100$B$KJQ99(B Applied in changeset r19213. ---------------------------------------- http://redmine.ruby-lang.org/issues/show/466
on 08.09.2008 03:53
$B$J$+$@$G$9!#(B At Sun, 7 Sep 2008 12:39:11 +0900, Kazuhiro NISHIYAMA wrote in [ruby-dev:36193]: > $B0J2<$N$h$&$K(Bconfigure$B$G%A%'%C%/$7$F$7$^$&$N$,$$$$$+$H;W$C$?$N$G$9$,!"(B > $B$I$&$G$7$g$&$+(B? > > $B1F6AHO0O$,$h$/$o$+$i$J$+$C$?$N$G!"<B:]$KCM$,JQ$o$C$F$7$^$&$3$H$,$"$C$?(B > darwin$B$N;~$@$1%A%'%C%/$9$k$h$&$J%Q%C%A$K$7$F$_$^$7$?!#(B $B8=:_$N%i%$%V%i%j$G$O$?$^$?$^Kh2s7k2L$,JQ$o$C$F$$$^$9$,!"$D$M$K$=(B $B$&$J$k$H$O8B$i$J$$$N$G$O$J$$$G$7$g$&$+!#Kh2sF1$8@5$7$/$J$$7k2L$r(B $BJV$9$H$$$&2DG=@-$b$"$k$o$1$G!#(B "$1"$B$d(B"$2"$B$G;O$^$k(Bsalt$B$G%"%k%4%j%:%`$rA*Br$9$k$H$$$&3HD%5!G=$N$"(B $B$k%7%9%F%`$b$"$j$^$9$,!"(B8bit$BL\$r;H$C$?3HD%$H$$$&$N$O$J$$$H;W$o$l(B $B$^$9!#(B 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);
on 08.09.2008 12:31
$B@>;3OB9-$G$9!#(B At Mon, 8 Sep 2008 10:46:45 +0900, Nobuyoshi Nakada wrote: > > $B8=:_$N%i%$%V%i%j$G$O$?$^$?$^Kh2s7k2L$,JQ$o$C$F$$$^$9$,!"$D$M$K$=(B > $B$&$J$k$H$O8B$i$J$$$N$G$O$J$$$G$7$g$&$+!#Kh2sF1$8@5$7$/$J$$7k2L$r(B > $BJV$9$H$$$&2DG=@-$b$"$k$o$1$G!#(B $BKh2sF1$8@5$7$/$J$$7k2L$,JV$C$F$/$k$J$i!"$=$l$O$=$l$GLdBj$,(B $B$*$-$J$5$=$&$J5$$,$7$^$9$,!#(B > "$1"$B$d(B"$2"$B$G;O$^$k(Bsalt$B$G%"%k%4%j%:%`$rA*Br$9$k$H$$$&3HD%5!G=$N$"(B > $B$k%7%9%F%`$b$"$j$^$9$,!"(B8bit$BL\$r;H$C$?3HD%$H$$$&$N$O$J$$$H;W$o$l(B > $B$^$9!#(B 8$B%S%C%HL\$r%/%j%"$7$?7k2L$,$?$^$?$^(B"$1"$B$d(B"$2"$B$K$J$C$F$$$?$H$-$N(B $B$3$H$r9M$($F$$$J$+$C$?$N$G$9$,!"5$$K$7$J$/$F$b$$$$$N$G$7$g$&$+(B? > + result = rb_str_new2(crypt(s, salts)); $B$3$N(Bsalts$B$r(Bsaltp$B$KJQ99$7$F!"%F%9%H$,DL$k$3$H$r3NG'$7$^$7$?!#(B
on 08.09.2008 19:13
$B$J$+$@$G$9!#(B At Mon, 8 Sep 2008 19:23:47 +0900, Kazuhiro NISHIYAMA wrote in [ruby-dev:36213]: > > $B8=:_$N%i%$%V%i%j$G$O$?$^$?$^Kh2s7k2L$,JQ$o$C$F$$$^$9$,!"$D$M$K$=(B > > $B$&$J$k$H$O8B$i$J$$$N$G$O$J$$$G$7$g$&$+!#Kh2sF1$8@5$7$/$J$$7k2L$r(B > > $BJV$9$H$$$&2DG=@-$b$"$k$o$1$G!#(B > > $BKh2sF1$8@5$7$/$J$$7k2L$,JV$C$F$/$k$J$i!"$=$l$O$=$l$GLdBj$,(B > $B$*$-$J$5$=$&$J5$$,$7$^$9$,!#(B $BLdBj$,$"$j$=$&$J$N$O!"B>$N%7%9%F%`$G0E9f2=$5$l$?$b$N$r$b$C$F$-$?(B $B>l9g$G$7$g$&$M!#(B > > "$1"$B$d(B"$2"$B$G;O$^$k(Bsalt$B$G%"%k%4%j%:%`$rA*Br$9$k$H$$$&3HD%5!G=$N$"(B > > $B$k%7%9%F%`$b$"$j$^$9$,!"(B8bit$BL\$r;H$C$?3HD%$H$$$&$N$O$J$$$H;W$o$l(B > > $B$^$9!#(B > > 8$B%S%C%HL\$r%/%j%"$7$?7k2L$,$?$^$?$^(B"$1"$B$d(B"$2"$B$K$J$C$F$$$?$H$-$N(B > $B$3$H$r9M$($F$$$J$+$C$?$N$G$9$,!"5$$K$7$J$/$F$b$$$$$N$G$7$g$&$+(B? crypt(3)$B$K$h$k$H(Bsalt$B$H$7$FM-8z$J$N$O(B[A-Za-z0-9./]$B$H$$$&$3$H$@$C(B $B$?$N$GL5;k$5$l$k$+$H;W$C$?$N$G$9$,!"(Bglibc$B$N(Bcrypt()$B$G$O(B "\xc1\xc1"$B$H(B"\x41\x41"$B$G$b0[$J$k7k2L$rJV$9$N$G!"C1$K%^%9%/$7$F$7(B $B$^$&$N$bLdBj$,$"$j$=$&$G$9!#(B