summaryrefslogtreecommitdiff
path: root/src/os/unix
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2010-11-29 15:29:38 +0000
committerJonathan Kolb <jon@b0g.us>2010-11-29 15:29:38 +0000
commit3f13cc6b2c2c6f71bcaa8b1e3a2e2190db6d852f (patch)
tree2ee4bc413b131dd56b1849f26bcc489da97750c3 /src/os/unix
parentdf5fa5fcb16c6fd65657add97be5f056b58afa36 (diff)
downloadnginx-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.c91
-rw-r--r--src/os/unix/ngx_errno.h26
-rw-r--r--src/os/unix/ngx_posix_init.c2
-rw-r--r--src/os/unix/ngx_process.c10
-rw-r--r--src/os/unix/ngx_user.c8
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)