mirror of
https://github.com/nginx/nginx.git
synced 2025-07-25 22:56:59 +08:00

The bug in question was fixed in glibc 2.3.2 and is no longer expected to manifest itself on real servers. On the other hand, the workaround causes compilation problems on various systems. Previously, we've already fixed the code to compile with musl libc (fd6fd02f6a4d), and now it is broken on Fedora 28 where glibc's crypt library was replaced by libxcrypt. So the workaround was removed.
77 lines
1.3 KiB
C
77 lines
1.3 KiB
C
|
|
/*
|
|
* Copyright (C) Igor Sysoev
|
|
* Copyright (C) Nginx, Inc.
|
|
*/
|
|
|
|
|
|
#include <ngx_config.h>
|
|
#include <ngx_core.h>
|
|
|
|
|
|
#if (NGX_CRYPT)
|
|
|
|
#if (NGX_HAVE_GNU_CRYPT_R)
|
|
|
|
ngx_int_t
|
|
ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)
|
|
{
|
|
char *value;
|
|
size_t len;
|
|
struct crypt_data cd;
|
|
|
|
cd.initialized = 0;
|
|
|
|
value = crypt_r((char *) key, (char *) salt, &cd);
|
|
|
|
if (value) {
|
|
len = ngx_strlen(value) + 1;
|
|
|
|
*encrypted = ngx_pnalloc(pool, len);
|
|
if (*encrypted == NULL) {
|
|
return NGX_ERROR;
|
|
}
|
|
|
|
ngx_memcpy(*encrypted, value, len);
|
|
return NGX_OK;
|
|
}
|
|
|
|
ngx_log_error(NGX_LOG_CRIT, pool->log, ngx_errno, "crypt_r() failed");
|
|
|
|
return NGX_ERROR;
|
|
}
|
|
|
|
#else
|
|
|
|
ngx_int_t
|
|
ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)
|
|
{
|
|
char *value;
|
|
size_t len;
|
|
ngx_err_t err;
|
|
|
|
value = crypt((char *) key, (char *) salt);
|
|
|
|
if (value) {
|
|
len = ngx_strlen(value) + 1;
|
|
|
|
*encrypted = ngx_pnalloc(pool, len);
|
|
if (*encrypted == NULL) {
|
|
return NGX_ERROR;
|
|
}
|
|
|
|
ngx_memcpy(*encrypted, value, len);
|
|
return NGX_OK;
|
|
}
|
|
|
|
err = ngx_errno;
|
|
|
|
ngx_log_error(NGX_LOG_CRIT, pool->log, err, "crypt() failed");
|
|
|
|
return NGX_ERROR;
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* NGX_CRYPT */
|