Annotation of embedaddon/nginx/src/os/unix/ngx_user.c, revision 1.1.1.1
1.1 misho 1:
2: /*
3: * Copyright (C) Igor Sysoev
4: * Copyright (C) Nginx, Inc.
5: */
6:
7:
8: #include <ngx_config.h>
9: #include <ngx_core.h>
10:
11:
12: /*
13: * Solaris has thread-safe crypt()
14: * Linux has crypt_r(); "struct crypt_data" is more than 128K
15: * FreeBSD needs the mutex to protect crypt()
16: *
17: * TODO:
18: * ngx_crypt_init() to init mutex
19: */
20:
21:
22: #if (NGX_CRYPT)
23:
24: #if (NGX_HAVE_GNU_CRYPT_R)
25:
26: ngx_int_t
27: ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)
28: {
29: char *value;
30: size_t len;
31: struct crypt_data cd;
32:
33: cd.initialized = 0;
34: /* work around the glibc bug */
35: cd.current_salt[0] = ~salt[0];
36:
37: value = crypt_r((char *) key, (char *) salt, &cd);
38:
39: if (value) {
40: len = ngx_strlen(value) + 1;
41:
42: *encrypted = ngx_pnalloc(pool, len);
43: if (*encrypted == NULL) {
44: return NGX_ERROR;
45: }
46:
47: ngx_memcpy(*encrypted, value, len);
48: return NGX_OK;
49: }
50:
51: ngx_log_error(NGX_LOG_CRIT, pool->log, ngx_errno, "crypt_r() failed");
52:
53: return NGX_ERROR;
54: }
55:
56: #else
57:
58: ngx_int_t
59: ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)
60: {
61: char *value;
62: size_t len;
63: ngx_err_t err;
64:
65: #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT)
66:
67: /* crypt() is a time consuming function, so we only try to lock */
68:
69: if (ngx_mutex_trylock(ngx_crypt_mutex) != NGX_OK) {
70: return NGX_AGAIN;
71: }
72:
73: #endif
74:
75: value = crypt((char *) key, (char *) salt);
76:
77: if (value) {
78: len = ngx_strlen(value) + 1;
79:
80: *encrypted = ngx_pnalloc(pool, len);
81: if (*encrypted == NULL) {
82: #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT)
83: ngx_mutex_unlock(ngx_crypt_mutex);
84: #endif
85: return NGX_ERROR;
86: }
87:
88: ngx_memcpy(*encrypted, value, len);
89: #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT)
90: ngx_mutex_unlock(ngx_crypt_mutex);
91: #endif
92: return NGX_OK;
93: }
94:
95: err = ngx_errno;
96:
97: #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT)
98: ngx_mutex_unlock(ngx_crypt_mutex);
99: #endif
100:
101: ngx_log_error(NGX_LOG_CRIT, pool->log, err, "crypt() failed");
102:
103: return NGX_ERROR;
104: }
105:
106: #endif
107:
108: #endif /* NGX_CRYPT */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>