summaryrefslogtreecommitdiffstats
path: root/string.c
diff options
context:
space:
mode:
authorkazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-07 08:57:53 +0000
committerkazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-07 08:57:53 +0000
commit5d5ac821cade9ae630389a45a671e3ff3991bff4 (patch)
tree376718743cf772a020cf081cde1eb0a65bf8276c /string.c
parent1e52cdcf1580a5a5744852663453af6523b45f3a (diff)
downloadruby-5d5ac821cade9ae630389a45a671e3ff3991bff4.tar.gz
ruby-5d5ac821cade9ae630389a45a671e3ff3991bff4.tar.xz
ruby-5d5ac821cade9ae630389a45a671e3ff3991bff4.zip
* 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: http://svn.ruby-lang.org/repos/ruby/trunk@19213 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/string.c b/string.c
index 080d6c9f3..60908ef23 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;