diff options
author | Igor Sysoev <igor@sysoev.ru> | 2010-11-29 15:29:38 +0000 |
---|---|---|
committer | Jonathan Kolb <jon@b0g.us> | 2010-11-29 15:29:38 +0000 |
commit | 3f13cc6b2c2c6f71bcaa8b1e3a2e2190db6d852f (patch) | |
tree | 2ee4bc413b131dd56b1849f26bcc489da97750c3 /src/os/unix | |
parent | df5fa5fcb16c6fd65657add97be5f056b58afa36 (diff) | |
download | nginx-0.9.0.tar.gz |
Changes with nginx 0.9.0 29 Nov 2010v0.9.0
*) Feature: the "keepalive_disable" directive.
*) Feature: the "map" directive supports variables as value of a
defined variable.
*) Feature: the "map" directive supports empty strings as value of the
first parameter.
*) Feature: the "map" directive supports expressions as the first
parameter.
*) Feature: nginx(8) manual page.
Thanks to Sergey Osokin.
*) Feature: Linux accept4() support.
Thanks to Simon Liu.
*) Workaround: elimination of Linux linker warning about "sys_errlist"
and "sys_nerr"; the warning had appeared in 0.8.35.
*) Bugfix: a segmentation fault might occur in a worker process, if the
"auth_basic" directive was used.
Thanks to Michail Laletin.
*) Bugfix: compatibility with ngx_http_eval_module; the bug had
appeared in 0.8.42.
Diffstat (limited to 'src/os/unix')
-rw-r--r-- | src/os/unix/ngx_errno.c | 91 | ||||
-rw-r--r-- | src/os/unix/ngx_errno.h | 26 | ||||
-rw-r--r-- | src/os/unix/ngx_posix_init.c | 2 | ||||
-rw-r--r-- | src/os/unix/ngx_process.c | 10 | ||||
-rw-r--r-- | src/os/unix/ngx_user.c | 8 |
5 files changed, 69 insertions, 68 deletions
diff --git a/src/os/unix/ngx_errno.c b/src/os/unix/ngx_errno.c index a250f496d..02994b808 100644 --- a/src/os/unix/ngx_errno.c +++ b/src/os/unix/ngx_errno.c @@ -8,54 +8,79 @@ #include <ngx_core.h> -#if (NGX_HAVE_STRERROR_R) +/* + * The strerror() messages are copied because: + * + * 1) strerror() and strerror_r() functions are not Async-Signal-Safe, + * therefore, they can not be used in signal handlers; + * + * 2) a direct sys_errlist[] array may be used instead of these functions, + * but Linux linker warns about its usage: + * + * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead + * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead + * + * causing false bug reports. + */ -u_char * -ngx_strerror_r(int err, u_char *errstr, size_t size) -{ - if (size == 0) { - return errstr; - } - errstr[0] = '\0'; +static ngx_str_t *ngx_sys_errlist; +static ngx_str_t ngx_unknown_error = ngx_string("Unknown error"); - strerror_r(err, (char *) errstr, size); - while (*errstr && size) { - errstr++; - size--; - } +u_char * +ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) +{ + ngx_str_t *msg; - return errstr; -} + msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]: + &ngx_unknown_error; + size = ngx_min(size, msg->len); -#elif (NGX_HAVE_GNU_STRERROR_R) + return ngx_cpymem(errstr, msg->data, size); +} -/* Linux strerror_r() */ -u_char * -ngx_strerror_r(int err, u_char *errstr, size_t size) +ngx_uint_t +ngx_strerror_init(void) { - char *str; + char *msg; + u_char *p; + size_t len; + ngx_err_t err; + + /* + * ngx_strerror() is not ready to work at this stage, therefore, + * malloc() is used and possible errors are logged using strerror(). + */ + + len = NGX_SYS_NERR * sizeof(ngx_str_t); - if (size == 0) { - return errstr; + ngx_sys_errlist = malloc(len); + if (ngx_sys_errlist == NULL) { + goto failed; } - errstr[0] = '\0'; + for (err = 0; err < NGX_SYS_NERR; err++) { + msg = strerror(err); + len = ngx_strlen(msg); - str = strerror_r(err, (char *) errstr, size); + p = malloc(len); + if (p == NULL) { + goto failed; + } - if (str != (char *) errstr) { - return ngx_cpystrn(errstr, (u_char *) str, size); + ngx_memcpy(p, msg, len); + ngx_sys_errlist[err].len = len; + ngx_sys_errlist[err].data = p; } - while (*errstr && size) { - errstr++; - size--; - } + return NGX_OK; - return errstr; -} +failed: -#endif + err = errno; + ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err)); + + return NGX_ERROR; +} diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h index e1891e74b..3d51f3cfc 100644 --- a/src/os/unix/ngx_errno.h +++ b/src/os/unix/ngx_errno.h @@ -60,30 +60,8 @@ typedef int ngx_err_t; #define ngx_set_socket_errno(err) errno = err -#if (NGX_HAVE_STRERROR_R || NGX_HAVE_GNU_STRERROR_R) - -u_char *ngx_strerror_r(int err, u_char *errstr, size_t size); - -#else - -/* Solaris and Tru64 UNIX have thread-safe strerror() */ - -#define ngx_strerror_r(err, errstr, size) \ - ngx_cpystrn(errstr, (u_char *) strerror(err), size) - -#endif - - -#if (NGX_HAVE_SYS_ERRLIST) - -#define ngx_sigsafe_strerror(err) \ - (err > 0 && err < sys_nerr) ? sys_errlist[err] : "Unknown error" - -#else - -#define ngx_sigsafe_strerror(err) "" - -#endif +u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size); +ngx_uint_t ngx_strerror_init(void); #endif /* _NGX_ERRNO_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_posix_init.c b/src/os/unix/ngx_posix_init.c index f21614499..2357ab31f 100644 --- a/src/os/unix/ngx_posix_init.c +++ b/src/os/unix/ngx_posix_init.c @@ -60,7 +60,7 @@ ngx_os_init(ngx_log_t *log) ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur; -#if (NGX_HAVE_INHERITED_NONBLOCK) +#if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4) ngx_inherited_nonblocking = 1; #else ngx_inherited_nonblocking = 0; diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c index 4574dfaf3..605558786 100644 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c @@ -479,17 +479,15 @@ ngx_process_get_status(void) */ if (err == NGX_ECHILD) { - ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, - "waitpid() failed (%d: %s)", - err, ngx_sigsafe_strerror(err)); + ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, err, + "waitpid() failed"); return; } #endif - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "waitpid() failed (%d: %s)", - err, ngx_sigsafe_strerror(err)); + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err, + "waitpid() failed"); return; } diff --git a/src/os/unix/ngx_user.c b/src/os/unix/ngx_user.c index 4bad1c307..165c6a46b 100644 --- a/src/os/unix/ngx_user.c +++ b/src/os/unix/ngx_user.c @@ -41,11 +41,11 @@ ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) err = ngx_errno; if (err == 0) { - len = ngx_strlen(value); + len = ngx_strlen(value) + 1; *encrypted = ngx_pnalloc(pool, len); if (*encrypted) { - ngx_memcpy(*encrypted, value, len + 1); + ngx_memcpy(*encrypted, value, len); return NGX_OK; } } @@ -79,11 +79,11 @@ ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) value = crypt((char *) key, (char *) salt); if (value) { - len = ngx_strlen(value); + len = ngx_strlen(value) + 1; *encrypted = ngx_pnalloc(pool, len); if (*encrypted) { - ngx_memcpy(*encrypted, value, len + 1); + ngx_memcpy(*encrypted, value, len); } #if (NGX_THREADS && NGX_NONREENTRANT_CRYPT) |