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
This commit is contained in:
nobu 2017-05-24 06:55:09 +00:00
Родитель 9e1624cfe8
Коммит 92261511b6
2 изменённых файлов: 10 добавлений и 2 удалений

Просмотреть файл

@ -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));