From 6bf5c34cf20002491423ca69dc3b0d037afaaefd Mon Sep 17 00:00:00 2001 From: kazu Date: Sun, 7 Sep 2008 08:57:53 +0000 Subject: * configure.in: Mac OS X's crypt(2) is broken with invalid salt. [ruby-dev:35899] * string.c (rb_str_crypt): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19213 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'string.c') diff --git a/string.c b/string.c index 080d6c9f3f..60908ef233 100644 --- a/string.c +++ b/string.c @@ -5862,6 +5862,10 @@ rb_str_crypt(VALUE str, VALUE salt) 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 @@ rb_str_crypt(VALUE str, VALUE salt) 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; -- cgit v1.2.3