diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-24 06:55:09 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-24 06:55:09 +0000 |
commit | 92261511b662c3f690f2c1dd70ab36161c676737 (patch) | |
tree | e9cba973aaaee79b5785c98d0765743cb3005521 | |
parent | 9e1624cfe8880fc018e34327c77669f2f4e5b100 (diff) |
string.c: for small crypt_data
* string.c (rb_str_crypt): struct crypt_data defined in
missing/crypt.h is small enough.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58866 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | missing/crypt.h | 2 | ||||
-rw-r--r-- | string.c | 10 |
2 files changed, 10 insertions, 2 deletions
diff --git a/missing/crypt.h b/missing/crypt.h index 7c2642f593..7a78767931 100644 --- a/missing/crypt.h +++ b/missing/crypt.h @@ -237,6 +237,8 @@ struct crypt_data { char cryptresult[1+4+4+11+1]; /* encrypted result */ }; +#define SIZEOF_CRYPT_DATA (KS_SIZE*8+(1+4+4+11+1)) + char *crypt(const char *key, const char *setting); void setkey(const char *key); void encrypt(char *block, int flag); @@ -8722,8 +8722,14 @@ rb_str_oct(VALUE str) static VALUE rb_str_crypt(VALUE str, VALUE salt) { +#undef LARGE_CRYPT_DATA #ifdef HAVE_CRYPT_R +# if defined SIZEOF_CRYPT_DATA && SIZEOF_CRYPT_DATA <= 256 + struct crypt_data cdata, *const data = &cdata; +# else +# undef LARGE_CRYPT_DATA struct crypt_data *data = ALLOC(struct crypt_data); +# endif #else extern char *crypt(const char *, const char *); #endif @@ -8762,7 +8768,7 @@ rb_str_crypt(VALUE str, VALUE salt) res = crypt(s, saltp); #endif if (!res) { -#ifdef HAVE_CRYPT_R +#ifdef LARGE_CRYPT_DATA int err = errno; xfree(data); errno = err; @@ -8770,7 +8776,7 @@ rb_str_crypt(VALUE str, VALUE salt) rb_sys_fail("crypt"); } result = rb_str_new_cstr(res); -#ifdef HAVE_CRYPT_R +#ifdef LARGE_CRYPT_DATA xfree(data); #endif FL_SET_RAW(result, OBJ_TAINTED_RAW(str) | OBJ_TAINTED_RAW(salt)); |