[PATCH 4 of 4] Cleaned up unsafe ngx_errno and ngx_socket_errno usage

Maxim Dounin mdounin at mdounin.ru
Sun Dec 28 17:36:50 UTC 2025


# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1766836715 -10800
#      Sat Dec 27 14:58:35 2025 +0300
# Node ID 353f1106597651ab6d43ff2039801001603add51
# Parent  b2a44f0a26068f3eb6d66a80d789ac6177672ce7
Cleaned up unsafe ngx_errno and ngx_socket_errno usage.

Typical incorrect pattern is to call a function, then log some debugging
information with a ngx_log_debugN() call, and then use ngx_errno if the
function returned an error.  This might lead to incorrect ngx_errno value
being checked or logged, since ngx_log_debugN() might clobber errno if
debugging is enabled.

Fix is to save ngx_errno (and ngx_socket_errno) before debug logging,
similarly to what we already do in many other places, or to reorder the
code if appropriate.

diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -42,8 +42,9 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
 {
     void                *rv;
     char               **senv;
+    ngx_err_t            err;
+    ngx_log_t           *log;
     ngx_uint_t           i, n;
-    ngx_log_t           *log;
     ngx_time_t          *tp;
     ngx_conf_t           conf;
     ngx_pool_t          *pool;
@@ -387,12 +388,14 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
                                    NGX_FILE_CREATE_OR_OPEN,
                                    NGX_FILE_DEFAULT_ACCESS);
 
+        err = ngx_errno;
+
         ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,
                        "log: %p %d \"%s\"",
                        &file[i], file[i].fd, file[i].name.data);
 
         if (file[i].fd == NGX_INVALID_FILE) {
-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+            ngx_log_error(NGX_LOG_EMERG, log, err,
                           ngx_open_file_n " \"%s\" failed",
                           file[i].name.data);
             goto failed;
@@ -1238,6 +1241,7 @@ void
 ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user)
 {
     ngx_fd_t          fd;
+    ngx_err_t         err;
     ngx_uint_t        i;
     ngx_list_part_t  *part;
     ngx_open_file_t  *file;
@@ -1267,12 +1271,14 @@ ngx_reopen_files(ngx_cycle_t *cycle, ngx
         fd = ngx_open_file(file[i].name.data, NGX_FILE_APPEND,
                            NGX_FILE_CREATE_OR_OPEN, NGX_FILE_DEFAULT_ACCESS);
 
+        err = ngx_errno;
+
         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                        "reopen file \"%s\", old:%d new:%d",
                        file[i].name.data, file[i].fd, fd);
 
         if (fd == NGX_INVALID_FILE) {
-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+            ngx_log_error(NGX_LOG_EMERG, cycle->log, err,
                           ngx_open_file_n " \"%s\" failed", file[i].name.data);
             continue;
         }
diff --git a/src/core/ngx_file.c b/src/core/ngx_file.c
--- a/src/core/ngx_file.c
+++ b/src/core/ngx_file.c
@@ -201,6 +201,8 @@ ngx_create_temp_file(ngx_file_t *file, n
 
         file->fd = ngx_open_tempfile(file->name.data, persistent, access);
 
+        err = ngx_errno;
+
         ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
                        "temp fd:%d", file->fd);
 
@@ -216,8 +218,6 @@ ngx_create_temp_file(ngx_file_t *file, n
             return NGX_OK;
         }
 
-        err = ngx_errno;
-
         if (err == NGX_EEXIST_FILE) {
             n = (uint32_t) ngx_next_temp_number(1);
             continue;
diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -387,8 +387,9 @@ ngx_log_check_rate(ngx_log_t *log, ngx_u
 ngx_log_t *
 ngx_log_init(u_char *prefix, u_char *error_log)
 {
-    u_char  *p, *name;
-    size_t   nlen, plen;
+    u_char     *p, *name;
+    size_t      nlen, plen;
+    ngx_err_t   err;
 
     ngx_log.file = &ngx_log_file;
     ngx_log.log_level = NGX_LOG_NOTICE;
@@ -448,11 +449,13 @@ ngx_log_init(u_char *prefix, u_char *err
                                     NGX_FILE_DEFAULT_ACCESS);
 
     if (ngx_log_file.fd == NGX_INVALID_FILE) {
-        ngx_log_stderr(ngx_errno,
+        err = ngx_errno;
+
+        ngx_log_stderr(err,
                        "[alert] could not open error log file: "
                        ngx_open_file_n " \"%s\" failed", name);
 #if (NGX_WIN32)
-        ngx_event_log(ngx_errno,
+        ngx_event_log(err,
                        "could not open error log file: "
                        ngx_open_file_n " \"%s\" failed", name);
 #endif
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -4465,14 +4465,14 @@ ngx_udp_connect(ngx_resolver_connection_
 
     s = ngx_socket(rec->sockaddr->sa_family, SOCK_DGRAM, 0);
 
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "UDP socket %d", s);
-
     if (s == (ngx_socket_t) -1) {
         ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,
                       ngx_socket_n " failed");
         return NGX_ERROR;
     }
 
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "UDP socket %d", s);
+
     c = ngx_get_connection(s, &rec->log);
 
     if (c == NULL) {
@@ -4553,14 +4553,14 @@ ngx_tcp_connect(ngx_resolver_connection_
 
     s = ngx_socket(rec->sockaddr->sa_family, SOCK_STREAM, 0);
 
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "TCP socket %d", s);
-
     if (s == (ngx_socket_t) -1) {
         ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,
                       ngx_socket_n " failed");
         return NGX_ERROR;
     }
 
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "TCP socket %d", s);
+
     c = ngx_get_connection(s, &rec->log);
 
     if (c == NULL) {
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c
--- a/src/event/modules/ngx_epoll_module.c
+++ b/src/event/modules/ngx_epoll_module.c
@@ -980,6 +980,8 @@ ngx_epoll_eventfd_handler(ngx_event_t *e
 
         events = io_getevents(ngx_aio_ctx, 1, 64, event, &ts);
 
+        err = ngx_errno;
+
         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,
                        "io_getevents: %d", events);
 
@@ -1013,7 +1015,7 @@ ngx_epoll_eventfd_handler(ngx_event_t *e
         }
 
         /* events == -1 */
-        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,
+        ngx_log_error(NGX_LOG_ALERT, ev->log, err,
                       "io_getevents() failed");
         return;
     }
diff --git a/src/event/ngx_event_acceptex.c b/src/event/ngx_event_acceptex.c
--- a/src/event/ngx_event_acceptex.c
+++ b/src/event/ngx_event_acceptex.c
@@ -106,16 +106,15 @@ ngx_event_post_acceptex(ngx_listening_t 
 
         s = ngx_socket(ls->sockaddr->sa_family, ls->type, 0);
 
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &ls->log, 0,
-                       ngx_socket_n " s:%d", s);
-
         if (s == (ngx_socket_t) -1) {
             ngx_log_error(NGX_LOG_ALERT, &ls->log, ngx_socket_errno,
                           ngx_socket_n " failed");
-
             return NGX_ERROR;
         }
 
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &ls->log, 0,
+                       ngx_socket_n " s:%d", s);
+
         c = ngx_get_connection(s, &ls->log);
 
         if (c == NULL) {
diff --git a/src/event/ngx_event_connect.c b/src/event/ngx_event_connect.c
--- a/src/event/ngx_event_connect.c
+++ b/src/event/ngx_event_connect.c
@@ -40,15 +40,15 @@ ngx_event_connect_peer(ngx_peer_connecti
 
     s = ngx_socket(pc->sockaddr->sa_family, type, 0);
 
-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, "%s socket %d",
-                   (type == SOCK_STREAM) ? "stream" : "dgram", s);
-
     if (s == (ngx_socket_t) -1) {
         ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
                       ngx_socket_n " failed");
         return NGX_ERROR;
     }
 
+    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, "%s socket %d",
+                   (type == SOCK_STREAM) ? "stream" : "dgram", s);
+
 
     c = ngx_get_connection(s, pc->log);
 
diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -38,7 +38,8 @@ static void ngx_ssl_handshake_handler(ng
 static ssize_t ngx_ssl_recv_early(ngx_connection_t *c, u_char *buf,
     size_t size);
 #endif
-static ngx_int_t ngx_ssl_handle_recv(ngx_connection_t *c, int n);
+static ngx_int_t ngx_ssl_handle_recv(ngx_connection_t *c, int n,
+    ngx_err_t err);
 static void ngx_ssl_write_handler(ngx_event_t *wev);
 #ifdef SSL_READ_EARLY_DATA_SUCCESS
 static ssize_t ngx_ssl_write_early(ngx_connection_t *c, u_char *data,
@@ -2324,6 +2325,8 @@ ngx_ssl_handshake(ngx_connection_t *c)
 
     n = SSL_do_handshake(c->ssl->connection);
 
+    err = ngx_socket_errno;
+
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n);
 
     if (n == 1) {
@@ -2423,7 +2426,9 @@ ngx_ssl_handshake(ngx_connection_t *c)
         return NGX_AGAIN;
     }
 
-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_socket_errno : 0;
+    if (sslerr != SSL_ERROR_SYSCALL) {
+        err = 0;
+    }
 
     c->ssl->no_wait_shutdown = 1;
     c->ssl->no_send_shutdown = 1;
@@ -2468,6 +2473,8 @@ ngx_ssl_try_early_data(ngx_connection_t 
 
     n = SSL_read_early_data(c->ssl->connection, &buf, 1, &readbytes);
 
+    err = ngx_socket_errno;
+
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "SSL_read_early_data: %d, %uz", n, readbytes);
 
@@ -2570,7 +2577,9 @@ ngx_ssl_try_early_data(ngx_connection_t 
         return NGX_AGAIN;
     }
 
-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_socket_errno : 0;
+    if (sslerr != SSL_ERROR_SYSCALL) {
+        err = 0;
+    }
 
     c->ssl->no_wait_shutdown = 1;
     c->ssl->no_send_shutdown = 1;
@@ -2738,7 +2747,8 @@ ngx_ssl_recv_chain(ngx_connection_t *c, 
 ssize_t
 ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)
 {
-    int  n, bytes;
+    int        n, bytes;
+    ngx_err_t  err;
 
 #ifdef SSL_READ_EARLY_DATA_SUCCESS
     if (c->ssl->in_early) {
@@ -2771,13 +2781,15 @@ ngx_ssl_recv(ngx_connection_t *c, u_char
 
         n = SSL_read(c->ssl->connection, buf, size);
 
+        err = ngx_socket_errno;
+
         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_read: %d", n);
 
         if (n > 0) {
             bytes += n;
         }
 
-        c->ssl->last = ngx_ssl_handle_recv(c, n);
+        c->ssl->last = ngx_ssl_handle_recv(c, n, err);
 
         if (c->ssl->last == NGX_OK) {
 
@@ -2870,6 +2882,7 @@ ngx_ssl_recv_early(ngx_connection_t *c, 
 {
     int        n, bytes;
     size_t     readbytes;
+    ngx_err_t  err;
 
     if (c->ssl->last == NGX_ERROR) {
         c->read->ready = 0;
@@ -2919,12 +2932,14 @@ ngx_ssl_recv_early(ngx_connection_t *c, 
 
         n = SSL_read_early_data(c->ssl->connection, buf, size, &readbytes);
 
+        err = ngx_socket_errno;
+
         ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "SSL_read_early_data: %d, %uz", n, readbytes);
 
         if (n == SSL_READ_EARLY_DATA_SUCCESS) {
 
-            c->ssl->last = ngx_ssl_handle_recv(c, 1);
+            c->ssl->last = ngx_ssl_handle_recv(c, 1, 0);
 
             bytes += readbytes;
             size -= readbytes;
@@ -2941,7 +2956,7 @@ ngx_ssl_recv_early(ngx_connection_t *c, 
 
         if (n == SSL_READ_EARLY_DATA_FINISH) {
 
-            c->ssl->last = ngx_ssl_handle_recv(c, 1);
+            c->ssl->last = ngx_ssl_handle_recv(c, 1, 0);
             c->ssl->in_early = 0;
 
             if (bytes) {
@@ -2954,7 +2969,7 @@ ngx_ssl_recv_early(ngx_connection_t *c, 
 
         /* SSL_READ_EARLY_DATA_ERROR */
 
-        c->ssl->last = ngx_ssl_handle_recv(c, 0);
+        c->ssl->last = ngx_ssl_handle_recv(c, 0, err);
 
         if (bytes) {
             if (c->ssl->last != NGX_AGAIN) {
@@ -2987,10 +3002,9 @@ ngx_ssl_recv_early(ngx_connection_t *c, 
 
 
 static ngx_int_t
-ngx_ssl_handle_recv(ngx_connection_t *c, int n)
+ngx_ssl_handle_recv(ngx_connection_t *c, int n, ngx_err_t err)
 {
-    int        sslerr;
-    ngx_err_t  err;
+    int  sslerr;
 
 #if (!defined SSL_OP_NO_RENEGOTIATION                                         \
      && !defined SSL_OP_NO_CLIENT_RENEGOTIATION)
@@ -3039,8 +3053,6 @@ ngx_ssl_handle_recv(ngx_connection_t *c,
 
     sslerr = SSL_get_error(c->ssl->connection, n);
 
-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_socket_errno : 0;
-
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);
 
     if (sslerr == SSL_ERROR_WANT_READ) {
@@ -3085,6 +3097,10 @@ ngx_ssl_handle_recv(ngx_connection_t *c,
         return NGX_AGAIN;
     }
 
+    if (sslerr != SSL_ERROR_SYSCALL) {
+        err = 0;
+    }
+
     c->ssl->no_wait_shutdown = 1;
     c->ssl->no_send_shutdown = 1;
 
@@ -3327,6 +3343,8 @@ ngx_ssl_write(ngx_connection_t *c, u_cha
 
     n = SSL_write(c->ssl->connection, data, size);
 
+    err = ngx_socket_errno;
+
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_write: %d", n);
 
     if (n > 0) {
@@ -3363,8 +3381,6 @@ ngx_ssl_write(ngx_connection_t *c, u_cha
         sslerr = SSL_ERROR_SYSCALL;
     }
 
-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_socket_errno : 0;
-
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);
 
     if (sslerr == SSL_ERROR_WANT_WRITE) {
@@ -3410,6 +3426,10 @@ ngx_ssl_write(ngx_connection_t *c, u_cha
         return NGX_AGAIN;
     }
 
+    if (sslerr != SSL_ERROR_SYSCALL) {
+        err = 0;
+    }
+
     c->ssl->no_wait_shutdown = 1;
     c->ssl->no_send_shutdown = 1;
     c->write->error = 1;
@@ -3437,6 +3457,8 @@ ngx_ssl_write_early(ngx_connection_t *c,
 
     n = SSL_write_early_data(c->ssl->connection, data, size, &written);
 
+    err = ngx_socket_errno;
+
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "SSL_write_early_data: %d, %uz", n, written);
 
@@ -3467,8 +3489,6 @@ ngx_ssl_write_early(ngx_connection_t *c,
 
     sslerr = SSL_get_error(c->ssl->connection, n);
 
-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_socket_errno : 0;
-
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);
 
     if (sslerr == SSL_ERROR_WANT_WRITE) {
@@ -3525,6 +3545,10 @@ ngx_ssl_write_early(ngx_connection_t *c,
         return NGX_AGAIN;
     }
 
+    if (sslerr != SSL_ERROR_SYSCALL) {
+        err = 0;
+    }
+
     c->ssl->no_wait_shutdown = 1;
     c->ssl->no_send_shutdown = 1;
     c->write->error = 1;
@@ -3569,6 +3593,8 @@ ngx_ssl_sendfile(ngx_connection_t *c, ng
     n = SSL_sendfile(c->ssl->connection, file->file->fd, file->file_pos,
                      size, flags);
 
+    err = ngx_socket_errno;
+
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_sendfile: %z", n);
 
     if (n > 0) {
@@ -3624,7 +3650,7 @@ ngx_ssl_sendfile(ngx_connection_t *c, ng
 
     if (sslerr == SSL_ERROR_SSL
         && ERR_GET_REASON(ERR_peek_error()) == SSL_R_UNINITIALIZED
-        && ngx_socket_errno != 0)
+        && err != 0)
     {
         /*
          * OpenSSL fails to return SSL_ERROR_SYSCALL if an error
@@ -3635,8 +3661,6 @@ ngx_ssl_sendfile(ngx_connection_t *c, ng
         sslerr = SSL_ERROR_SYSCALL;
     }
 
-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_socket_errno : 0;
-
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);
 
     if (sslerr == SSL_ERROR_WANT_WRITE) {
@@ -3656,7 +3680,7 @@ ngx_ssl_sendfile(ngx_connection_t *c, ng
 
 #if (NGX_HAVE_SENDFILE_NODISKIO)
 
-        if (ngx_socket_errno == EBUSY) {
+        if (err == EBUSY) {
             c->busy_count++;
 
             ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
@@ -3699,6 +3723,10 @@ ngx_ssl_sendfile(ngx_connection_t *c, ng
         return NGX_AGAIN;
     }
 
+    if (sslerr != SSL_ERROR_SYSCALL) {
+        err = 0;
+    }
+
     c->ssl->no_wait_shutdown = 1;
     c->ssl->no_send_shutdown = 1;
     c->write->error = 1;
@@ -3803,6 +3831,8 @@ ngx_ssl_shutdown(ngx_connection_t *c)
 
         n = SSL_shutdown(c->ssl->connection);
 
+        err = ngx_socket_errno;
+
         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_shutdown: %d", n);
 
         if (n == 1) {
@@ -3848,7 +3878,9 @@ ngx_ssl_shutdown(ngx_connection_t *c)
             goto done;
         }
 
-        err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_socket_errno : 0;
+        if (sslerr != SSL_ERROR_SYSCALL) {
+            err = 0;
+        }
 
         ngx_ssl_connection_error(c, sslerr, err, "SSL_shutdown() failed");
 
diff --git a/src/os/unix/ngx_file_aio_read.c b/src/os/unix/ngx_file_aio_read.c
--- a/src/os/unix/ngx_file_aio_read.c
+++ b/src/os/unix/ngx_file_aio_read.c
@@ -153,11 +153,12 @@ ngx_file_aio_result(ngx_file_t *file, ng
 
     n = aio_error(&aio->aiocb);
 
+    err = ngx_errno;
+
     ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,
                    "aio_error: fd:%d %d", file->fd, n);
 
     if (n == -1) {
-        err = ngx_errno;
         aio->err = err;
 
         ngx_log_error(NGX_LOG_ALERT, file->log, err,
diff --git a/src/os/unix/ngx_freebsd_init.c b/src/os/unix/ngx_freebsd_init.c
--- a/src/os/unix/ngx_freebsd_init.c
+++ b/src/os/unix/ngx_freebsd_init.c
@@ -109,10 +109,12 @@ ngx_os_specific_init(ngx_log_t *log)
     size = sizeof(ngx_freebsd_kern_ostype);
     if (sysctlbyname("kern.ostype",
                      ngx_freebsd_kern_ostype, &size, NULL, 0) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
+        err = ngx_errno;
+
+        ngx_log_error(NGX_LOG_ALERT, log, err,
                       "sysctlbyname(kern.ostype) failed");
 
-        if (ngx_errno != NGX_ENOMEM) {
+        if (err != NGX_ENOMEM) {
             return NGX_ERROR;
         }
 
@@ -122,7 +124,9 @@ ngx_os_specific_init(ngx_log_t *log)
     size = sizeof(ngx_freebsd_kern_osrelease);
     if (sysctlbyname("kern.osrelease",
                      ngx_freebsd_kern_osrelease, &size, NULL, 0) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
+        err = ngx_errno;
+
+        ngx_log_error(NGX_LOG_ALERT, log, err,
                       "sysctlbyname(kern.osrelease) failed");
 
         if (ngx_errno != NGX_ENOMEM) {
diff --git a/src/os/unix/ngx_recv.c b/src/os/unix/ngx_recv.c
--- a/src/os/unix/ngx_recv.c
+++ b/src/os/unix/ngx_recv.c
@@ -70,6 +70,8 @@ ngx_unix_recv(ngx_connection_t *c, u_cha
     do {
         n = recv(c->fd, buf, size, 0);
 
+        err = ngx_socket_errno;
+
         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "recv: fd:%d %z of %uz", c->fd, n, size);
 
@@ -179,8 +181,6 @@ ngx_unix_recv(ngx_connection_t *c, u_cha
             return n;
         }
 
-        err = ngx_socket_errno;
-
         if (err == NGX_EAGAIN || err == NGX_EINTR) {
             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
                            "recv() not ready");
diff --git a/src/os/unix/ngx_send.c b/src/os/unix/ngx_send.c
--- a/src/os/unix/ngx_send.c
+++ b/src/os/unix/ngx_send.c
@@ -33,6 +33,8 @@ ngx_unix_send(ngx_connection_t *c, u_cha
     for ( ;; ) {
         n = send(c->fd, buf, size, 0);
 
+        err = ngx_socket_errno;
+
         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "send: fd:%d %z of %uz", c->fd, n, size);
 
@@ -46,8 +48,6 @@ ngx_unix_send(ngx_connection_t *c, u_cha
             return n;
         }
 
-        err = ngx_socket_errno;
-
         if (n == 0) {
             ngx_log_error(NGX_LOG_ALERT, c->log, err, "send() returned zero");
             wev->ready = 0;
diff --git a/src/os/unix/ngx_udp_recv.c b/src/os/unix/ngx_udp_recv.c
--- a/src/os/unix/ngx_udp_recv.c
+++ b/src/os/unix/ngx_udp_recv.c
@@ -22,6 +22,8 @@ ngx_udp_unix_recv(ngx_connection_t *c, u
     do {
         n = recv(c->fd, buf, size, 0);
 
+        err = ngx_socket_errno;
+
         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "recv: fd:%d %z of %uz", c->fd, n, size);
 
@@ -48,8 +50,6 @@ ngx_udp_unix_recv(ngx_connection_t *c, u
             return n;
         }
 
-        err = ngx_socket_errno;
-
         if (err == NGX_EAGAIN || err == NGX_EINTR) {
             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
                            "recv() not ready");
diff --git a/src/os/unix/ngx_udp_send.c b/src/os/unix/ngx_udp_send.c
--- a/src/os/unix/ngx_udp_send.c
+++ b/src/os/unix/ngx_udp_send.c
@@ -22,6 +22,8 @@ ngx_udp_unix_send(ngx_connection_t *c, u
     for ( ;; ) {
         n = sendto(c->fd, buf, size, 0, c->sockaddr, c->socklen);
 
+        err = ngx_socket_errno;
+
         ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "sendto: fd:%d %z of %uz to \"%V\"",
                        c->fd, n, size, &c->addr_text);
@@ -38,8 +40,6 @@ ngx_udp_unix_send(ngx_connection_t *c, u
             return n;
         }
 
-        err = ngx_socket_errno;
-
         if (err == NGX_EAGAIN) {
             wev->ready = 0;
             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, NGX_EAGAIN,
diff --git a/src/os/unix/ngx_writev_chain.c b/src/os/unix/ngx_writev_chain.c
--- a/src/os/unix/ngx_writev_chain.c
+++ b/src/os/unix/ngx_writev_chain.c
@@ -188,12 +188,12 @@ eintr:
 
     n = writev(c->fd, vec->iovs, vec->count);
 
+    err = ngx_errno;
+
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "writev: %z of %uz", n, vec->size);
 
     if (n == -1) {
-        err = ngx_errno;
-
         switch (err) {
         case NGX_EAGAIN:
             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
diff --git a/src/os/win32/ngx_process.c b/src/os/win32/ngx_process.c
--- a/src/os/win32/ngx_process.c
+++ b/src/os/win32/ngx_process.c
@@ -23,6 +23,7 @@ ngx_spawn_process(ngx_cycle_t *cycle, ch
     u_long          rc, n, code;
     ngx_int_t       s;
     ngx_pid_t       pid;
+    ngx_err_t       err;
     ngx_exec_ctx_t  ctx;
     HANDLE          events[2];
     char            file[MAX_PATH + 1];
@@ -86,6 +87,8 @@ ngx_spawn_process(ngx_cycle_t *cycle, ch
 
     rc = WaitForMultipleObjects(2, events, 0, 5000);
 
+    err = ngx_errno;
+
     ngx_time_update();
 
     ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
@@ -150,7 +153,7 @@ ngx_spawn_process(ngx_cycle_t *cycle, ch
         goto failed;
 
     case WAIT_FAILED:
-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
                       "WaitForSingleObject(\"%s\") failed",
                       ngx_master_process_event_name);
 
diff --git a/src/os/win32/ngx_shmem.c b/src/os/win32/ngx_shmem.c
--- a/src/os/win32/ngx_shmem.c
+++ b/src/os/win32/ngx_shmem.c
@@ -73,12 +73,12 @@ ngx_shm_alloc(ngx_shm_t *shm)
         return NGX_ERROR;
     }
 
-    ngx_free(name);
-
     if (ngx_errno == ERROR_ALREADY_EXISTS) {
         shm->exists = 1;
     }
 
+    ngx_free(name);
+
     shm->addr = MapViewOfFileEx(shm->handle, FILE_MAP_WRITE, 0, 0, 0, base);
 
     if (shm->addr != NULL) {
diff --git a/src/os/win32/ngx_udp_wsarecv.c b/src/os/win32/ngx_udp_wsarecv.c
--- a/src/os/win32/ngx_udp_wsarecv.c
+++ b/src/os/win32/ngx_udp_wsarecv.c
@@ -26,6 +26,8 @@ ngx_udp_wsarecv(ngx_connection_t *c, u_c
 
     rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL);
 
+    err = ngx_socket_errno;
+
     ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "WSARecv: fd:%d rc:%d %ul of %z", c->fd, rc, bytes, size);
 
@@ -33,7 +35,6 @@ ngx_udp_wsarecv(ngx_connection_t *c, u_c
 
     if (rc == -1) {
         rev->ready = 0;
-        err = ngx_socket_errno;
 
         if (err == WSAEWOULDBLOCK) {
             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
@@ -112,13 +113,13 @@ ngx_udp_overlapped_wsarecv(ngx_connectio
     rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, ovlp, NULL);
 
     rev->complete = 0;
+    err = ngx_socket_errno;
 
     ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "WSARecv ovlp: fd:%d rc:%d %ul of %z",
                    c->fd, rc, bytes, size);
 
     if (rc == -1) {
-        err = ngx_socket_errno;
         if (err == WSA_IO_PENDING) {
             rev->active = 1;
             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
diff --git a/src/os/win32/ngx_wsarecv.c b/src/os/win32/ngx_wsarecv.c
--- a/src/os/win32/ngx_wsarecv.c
+++ b/src/os/win32/ngx_wsarecv.c
@@ -27,6 +27,8 @@ ngx_wsarecv(ngx_connection_t *c, u_char 
 
     rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL);
 
+    err = ngx_socket_errno;
+
     ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "WSARecv: fd:%d rc:%d %ul of %z", c->fd, rc, bytes, size);
 
@@ -34,7 +36,6 @@ ngx_wsarecv(ngx_connection_t *c, u_char 
 
     if (rc == -1) {
         rev->ready = 0;
-        err = ngx_socket_errno;
 
         if (err == WSAEWOULDBLOCK) {
             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
@@ -166,13 +167,13 @@ ngx_overlapped_wsarecv(ngx_connection_t 
     rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, ovlp, NULL);
 
     rev->complete = 0;
+    err = ngx_socket_errno;
 
     ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "WSARecv ovlp: fd:%d rc:%d %ul of %z",
                    c->fd, rc, bytes, size);
 
     if (rc == -1) {
-        err = ngx_socket_errno;
         if (err == WSA_IO_PENDING) {
             rev->active = 1;
             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
diff --git a/src/os/win32/ngx_wsasend.c b/src/os/win32/ngx_wsasend.c
--- a/src/os/win32/ngx_wsasend.c
+++ b/src/os/win32/ngx_wsasend.c
@@ -37,6 +37,8 @@ ngx_wsasend(ngx_connection_t *c, u_char 
 
     n = WSASend(c->fd, &wsabuf, 1, &sent, 0, NULL, NULL);
 
+    err = ngx_socket_errno;
+
     ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "WSASend: fd:%d, %d, %ul of %uz", c->fd, n, sent, size);
 
@@ -50,8 +52,6 @@ ngx_wsasend(ngx_connection_t *c, u_char 
         return sent;
     }
 
-    err = ngx_socket_errno;
-
     if (err == WSAEWOULDBLOCK) {
         ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, "WSASend() not ready");
         wev->ready = 0;
@@ -103,11 +103,12 @@ ngx_overlapped_wsasend(ngx_connection_t 
 
         n = WSASend(c->fd, &wsabuf, 1, &sent, 0, ovlp, NULL);
 
+        wev->complete = 0;
+        err = ngx_socket_errno;
+
         ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "WSASend: fd:%d, %d, %ul of %uz", c->fd, n, sent, size);
 
-        wev->complete = 0;
-
         if (n == 0) {
             if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
 
@@ -130,8 +131,6 @@ ngx_overlapped_wsasend(ngx_connection_t 
             return sent;
         }
 
-        err = ngx_socket_errno;
-
         if (err == WSA_IO_PENDING) {
             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
                            "WSASend() posted");



More information about the nginx-devel mailing list