[Bug #466] test_str_crypt(TestM17NComb) failed

Bug #466: test_str_crypt(TestM17NComb) failed
http://redmine.ruby-lang.org/issues/show/466

e$B5/I<<Te(B: Kazuhiro NISHIYAMA
e$B%9%F!<%?%9e(B: Open, e$BM%@hEYe(B: Normal

$ ruby-trunk -v
ruby 1.9.0 (2008-08-21 revision 18753) [powerpc-darwin9.4.0]
e$B$N4D6-$Ge(Btest_str_crypt(TestM17NComb)e$B$,e(BFailuree$B$K$J$j$^$9!#e(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”
$
e$B$N$h$&$Ke(B2e$B2sL\0J9_$G7k2L$,0c$&$N$,860x$N$h$&$G$9!#e(B

e$BD>@\e(Bcrypt(2)e$B$rF1$80z?t$G8F$s$G$bF1$87k2L$K$J$j$^$9!#e(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
$

e$B%A%1%C%He(B #466 e$B$,99?7$5$l$^$7$?!#e(B (by Yui NARUSE)

e$B%+%F%4%je(B coree$B$K%;%C%He(B
e$BC4Ev<Te(B Yui NARUSEe$B$+$ie(BKazuhiro NISHIYAMAe$B$KJQ99e(B

M17N
e$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!“e(B
e$B$H$j$”$($:C4Ev$r@>;3$5$s$KMB$1$^$9!#e(B

http://redmine.ruby-lang.org/issues/show/466

e$B%A%1%C%He(B #466 e$B$,99?7$5$l$^$7$?!#e(B (by Kazuhiro NISHIYAMA)

e$B0J2<$N$h$&$Ke(Bconfiguree$B$G%A%'%C%/$7$F$7$^$&$N$,$$$$$+$H;W$C$?$N$G$9$,!"e(B
e$B$I$&$G$7$g$&$+e(B?

e$B1F6AHO0O$,$h$/$o$+$i$J$+$C$?$N$G!“<B:]$KCM$,JQ$o$C$F$7$^$&$3$H$,$”$C$?e(B
darwine$B$N;~$@$1%A%'%C%/$9$k$h$&$J%Q%C%A$K$7$F$_$^$7$?!#e(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

e$B%A%1%C%He(B #466 e$B$,99?7$5$l$^$7$?!#e(B (by Anonymous)

e$B%9%F!<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

Applied in changeset r19213.

http://redmine.ruby-lang.org/issues/show/466

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(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
[email protected] writes:

|e$B0J2<$N$h$&$Ke(Bconfiguree$B$G%A%‘%C%/$7$F$7$^$&$N$,$$$$$+$H;W$C$?$N$G$9$,!“e(B
|e$B$I$&$G$7$g$&$+e(B?
|
|e$B1F6AHO0O$,$h$/$o$+$i$J$+$C$?$N$G!”<B:]$KCM$,JQ$o$C$F$7$^$&$3$H$,$"$C$?e(B
|darwine$B$N;~$@$1%A%’%C%/$9$k$h$&$J%Q%C%A$K$7$F$_$^$7$?!#e(B

e$B%3%_%C%H$7$F$/$@$5$$$^$;$s$+!)e(B

e$B$J$+$@$G$9!#e(B

At Sun, 7 Sep 2008 12:39:11 +0900,
Kazuhiro NISHIYAMA wrote in [ruby-dev:36193]:

e$B0J2<$N$h$&$Ke(Bconfiguree$B$G%A%’%C%/$7$F$7$^$&$N$,$$$$$+$H;W$C$?$N$G$9$,!"e(B
e$B$I$&$G$7$g$&$+e(B?

e$B1F6AHO0O$,$h$/$o$+$i$J$+$C$?$N$G!"<B:]$KCM$,JQ$o$C$F$7$^$&$3$H$,$"$C$?e(B
darwine$B$N;~$@$1%A%’%C%/$9$k$h$&$J%Q%C%A$K$7$F$_$^$7$?!#e(B

e$B8=:_$N%i%$%V%i%j$G$O$?$^$?$^Kh2s7k2L$,JQ$o$C$F$$$^$9$,!"$D$M$K$=e(B
e$B$&$J$k$H$O8B$i$J$$$N$G$O$J$$$G$7$g$&$+!#Kh2sF1$8@5$7$/$J$$7k2L$re(B
e$BJV$9$H$$$&2DG=@-$b$"$k$o$1$G!#e(B

“$1"e$B$de(B”$2"e$B$G;O$^$ke(Bsalte$B$G%"%k%4%j%:%$rA*Br$9$k$H$$$&3HD%5!G=$N$"e(B e$B$k%7%9%F%$b$"$j$^$9$,!"e(B8bite$BL$r;H$C$?3HD%$H$$$&$N$O$J$$$H;W$o$le(B
e$B$^$9!#e(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);

e$B$J$+$@$G$9!#e(B

At Mon, 8 Sep 2008 19:23:47 +0900,
Kazuhiro NISHIYAMA wrote in [ruby-dev:36213]:

e$B8=:_$N%i%$%V%i%j$G$O$?$^$?$^Kh2s7k2L$,JQ$o$C$F$$$^$9$,!"$D$M$K$=e(B
e$B$&$J$k$H$O8B$i$J$$$N$G$O$J$$$G$7$g$&$+!#Kh2sF1$8@5$7$/$J$$7k2L$re(B
e$BJV$9$H$$$&2DG=@-$b$"$k$o$1$G!#e(B

e$BKh2sF1$8@5$7$/$J$$7k2L$,JV$C$F$/$k$J$i!"$=$l$O$=$l$GLdBj$,e(B
e$B$*$-$J$5$=$&$J5$$,$7$^$9$,!#e(B

e$BLdBj$,$"$j$=$&$J$N$O!"B>$N%7%9%F%`$G0E9f2=$5$l$?$b$N$r$b$C$F$-$?e(B
e$B>l9g$G$7$g$&$M!#e(B

“$1"e$B$de(B”$2"e$B$G;O$^$ke(Bsalte$B$G%"%k%4%j%:%$rA*Br$9$k$H$$$&3HD%5!G=$N$"e(B e$B$k%7%9%F%$b$"$j$^$9$,!"e(B8bite$BL$r;H$C$?3HD%$H$$$&$N$O$J$$$H;W$o$le(B
e$B$^$9!#e(B

8e$B%S%C%HL$r%/%j%"$7$?7k2L$,$?$^$?$^e(B"$1"e$B$de(B"$2"e$B$K$J$C$F$$$?$H$-$Ne(B
e$B$3$H$r9M$($F$$$J$+$C$?$N$G$9$,!"5$$K$7$J$/$F$b$$$$$N$G$7$g$&$+e(B?

crypt(3)e$B$K$h$k$He(Bsalte$B$H$7$FM-8z$J$N$Oe(B[A-Za-z0-9./]e$B$H$$$&$3$H$@$Ce(B
e$B$?$N$GL5;k$5$l$k$+$H;W$C$?$N$G$9$,!"e(Bglibce$B$Ne(Bcrypt()e$B$G$Oe(B
“\xc1\xc1"e$B$He(B”\x41\x41"e$B$G$b0[$J$k7k2L$rJV$9$N$G!“C1$K%^%9%/$7$F$7e(B
e$B$^$&$N$bLdBj$,$”$j$=$&$G$9!#e(B

e$B@>;3OB9-$G$9!#e(B

At Mon, 8 Sep 2008 10:46:45 +0900,
Nobuyoshi N. wrote:

e$B8=:_$N%i%$%V%i%j$G$O$?$^$?$^Kh2s7k2L$,JQ$o$C$F$$$^$9$,!"$D$M$K$=e(B
e$B$&$J$k$H$O8B$i$J$$$N$G$O$J$$$G$7$g$&$+!#Kh2sF1$8@5$7$/$J$$7k2L$re(B
e$BJV$9$H$$$&2DG=@-$b$"$k$o$1$G!#e(B

e$BKh2sF1$8@5$7$/$J$$7k2L$,JV$C$F$/$k$J$i!"$=$l$O$=$l$GLdBj$,e(B
e$B$*$-$J$5$=$&$J5$$,$7$^$9$,!#e(B

“$1"e$B$de(B”$2"e$B$G;O$^$ke(Bsalte$B$G%"%k%4%j%:%$rA*Br$9$k$H$$$&3HD%5!G=$N$"e(B e$B$k%7%9%F%$b$"$j$^$9$,!"e(B8bite$BL$r;H$C$?3HD%$H$$$&$N$O$J$$$H;W$o$le(B
e$B$^$9!#e(B

8e$B%S%C%HL$r%/%j%"$7$?7k2L$,$?$^$?$^e(B"$1"e$B$de(B"$2"e$B$K$J$C$F$$$?$H$-$Ne(B
e$B$3$H$r9M$($F$$$J$+$C$?$N$G$9$,!"5$$K$7$J$/$F$b$$$$$N$G$7$g$&$+e(B?

  • result = rb_str_new2(crypt(s, salts));

e$B$3$Ne(Bsaltse$B$re(Bsaltpe$B$KJQ99$7$F!"%F%9%H$,DL$k$3$H$r3NG’$7$^$7$?!#e(B