summaryrefslogtreecommitdiffhomepage
path: root/src/os (follow)
AgeCommit message (Collapse)AuthorFilesLines
2018-07-22Fixed NGX_TID_T_FMT format specification for uint64_t.Maxim Dounin1-2/+2
Previously, "%uA" was used, which corresponds to ngx_atomic_uint_t. Size of ngx_atomic_uint_t can be easily different from uint64_t, leading to undefined results.
2018-05-29Win32: fixed comment in ngx_gettimeofday() calculations.Ruslan Ermilov1-1/+1
2018-05-23Removed glibc crypt_r() bug workaround (ticket #1469).Maxim Dounin1-4/+0
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.
2018-03-19Fixed checking ngx_tcp_push() and ngx_tcp_nopush() return values.Ruslan Ermilov2-2/+2
No functional changes.
2017-12-19Fixed capabilities version.Roman Arutyunyan1-1/+1
Previously, capset(2) was called with the 64-bit capabilities version _LINUX_CAPABILITY_VERSION_3. With this version Linux kernel expected two copies of struct __user_cap_data_struct, while only one was submitted. As a result, random stack memory was accessed and random capabilities were requested by the worker. This sometimes caused capset() errors. Now the 32-bit version _LINUX_CAPABILITY_VERSION_1 is used instead. This is OK since CAP_NET_RAW is a 32-bit capability (CAP_NET_RAW = 13).
2017-12-18Improved the capabilities feature detection.Roman Arutyunyan2-2/+2
Previously included file sys/capability.h mentioned in capset(2) man page, belongs to the libcap-dev package, which may not be installed on some Linux systems when compiling nginx. This prevented the capabilities feature from being detected and compiled on that systems. Now linux/capability.h system header is included instead. Since capset() declaration is located in sys/capability.h, now capset() syscall is defined explicitly in code using the SYS_capset constant, similarly to other Linux-specific features in nginx.
2017-12-13Retain CAP_NET_RAW capability for transparent proxying.Roman Arutyunyan2-0/+37
The capability is retained automatically in unprivileged worker processes after changing UID if transparent proxying is enabled at least once in nginx configuration. The feature is only available in Linux.
2017-12-11Use sysconf to determine cacheline size at runtime.Debayan Ghosh1-0/+10
Determine cacheline size at runtime if supported using sysconf(_SC_LEVEL1_DCACHE_LINESIZE). In case not supported, fallback to compile time defaults.
2017-11-28Removed unused FreeBSD-specific definitions in ngx_posix_config.h.Sergey Kandaurov1-20/+0
2017-11-28Fixed "changing binary" when reaper is not init.Ruslan Ermilov6-3/+11
On some systems, it's possible that reaper of orphaned processes is set to something other than "init" process. On such systems, the changing binary procedure did not work. The fix is to check if PPID has changed, instead of assuming it's always 1 for orphaned processes.
2017-09-18Removed more remnants of the old pthread implementation.Ruslan Ermilov1-10/+0
After e284f3ff6831, ngx_crypt() can no longer return NGX_AGAIN.
2017-08-09Style.Sergey Kandaurov2-0/+2
2017-06-01Style.Maxim Dounin1-3/+3
2017-04-27Added missing "fall through" comments (ticket #1259).Maxim Dounin1-0/+1
Found by gcc7 (-Wimplicit-fallthrough).
2017-04-20Core: signal sender pid logging.Igor Sysoev1-8/+24
2017-04-11Set UDP datagram source address (ticket #1239).Roman Arutyunyan1-0/+90
Previously, the source IP address of a response UDP datagram could differ from the original datagram destination address. This could happen if the server UDP socket is bound to a wildcard address and the network interface chosen to output the response packet has a different default address than the destination address of the original packet. For example, if two addresses from the same network are configured on an interface. Now source address is set explicitly if a response is sent for a server UDP socket bound to a wildcard address.
2017-04-17Enabled IPV6_RECVPKTINFO / IPV6_PKTINFO on macOS.Sergey Kandaurov1-0/+3
This change allows setting the destination IPv6 address of a UDP datagram received on a wildcard socket.
2017-03-28Simplified and improved sendfile() code on Linux.Maxim Dounin1-67/+47
The ngx_linux_sendfile() function is now used for both normal sendfile() and sendfile in threads. The ngx_linux_sendfile_thread() function was modified to use the same interface as ngx_linux_sendfile(), and is simply called from ngx_linux_sendfile() when threads are enabled. Special return code NGX_DONE is used to indicate that a thread task was posted and no further actions are needed. If number of bytes sent is less that what we were sending, we now always retry sending. This is needed for sendfile() in threads as the number of bytes we are sending might have been changed since the thread task was posted. And this is also needed for Linux 4.3+, as sendfile() might be interrupted at any time and provides no indication if it was interrupted or not (ticket #1174).
2017-03-16Added missing "static" specifier found by gcc -Wtraditional.Ruslan Ermilov1-1/+1
This has somehow escaped from fbdaad9b0e7b.
2017-03-07Style.Maxim Dounin1-2/+0
2017-03-07Introduced worker_shutdown_timeout.Maxim Dounin2-0/+2
The directive configures a timeout to be used when gracefully shutting down worker processes. When the timer expires, nginx will try to close all the connections currently open to facilitate shutdown.
2017-03-07Cancelable timers are now preserved if there are other timers.Maxim Dounin2-9/+2
There is no need to cancel timers early if there are other timers blocking shutdown anyway. Preserving such timers allows nginx to continue some periodic work till the shutdown is actually possible. With the new approach, timers with ev->cancelable are simply ignored when checking if there are any timers left during shutdown.
2017-01-20Removed pthread mutex / conditional variables debug messages.Maxim Dounin2-20/+0
These messages doesn't seem to be needed in practice and only make debugging logs harder to read.
2017-01-20Fixed trailer construction with limit on FreeBSD and macOS.Maxim Dounin2-7/+15
The ngx_chain_coalesce_file() function may produce more bytes to send then requested in the limit passed, as it aligns the last file position to send to memory page boundary. As a result, (limit - send) may become negative. This resulted in big positive number when converted to size_t while calling ngx_output_chain_to_iovec(). Another part of the problem is in ngx_chain_coalesce_file(): it changes cl to the next chain link even if the current buffer is only partially sent due to limit. Therefore, if a file buffer was not expected to be fully sent due to limit, and was followed by a memory buffer, nginx called sendfile() with a part of the file buffer, and the memory buffer in trailer. If there were enough room in the socket buffer, this resulted in a part of the file buffer being skipped, and corresponding part of the memory buffer sent instead. The bug was introduced in 8e903522c17a (1.7.8). Configurations affected are ones using limits, that is, limit_rate and/or sendfile_max_chunk, and memory buffers after file ones (may happen when using subrequests or with proxying with disk buffering). Fix is to explicitly check if (send < limit) before constructing trailer with ngx_output_chain_to_iovec(). Additionally, ngx_chain_coalesce_file() was modified to preserve unfinished file buffers in cl.
2016-12-24Win32: compatiblity with OpenSSL 1.1.0.Maxim Dounin1-0/+3
OpenSSL 1.1.0 now uses normal "nmake; nmake install" instead of using custom "ms\do_ms.bat" script and "ms\nt.mak" makefile. And Configure now requires --prefix to be absolute, and no longer derives --openssldir from prefix (so it's specified explicitly). Generated libraries are now called "libcrypto.lib" and "libssl.lib" instead of "libeay32.lib" and "ssleay32.lib". Appropriate tests added to support both old and new variants. Additionally, openssl/lhash.h now triggers warning C4090 ('function' : different 'const' qualifiers), so the warning was disabled.
2016-12-24Win32: support 64-bit compilation with MSVC.Maxim Dounin1-0/+10
There are lots of C4244 warnings (conversion from 'type1' to 'type2', possible loss of data), so they were disabled. The same applies to C4267 warnings (conversion from 'size_t' to 'type', possible loss of data), most notably - conversion from ngx_str_t.len to ngx_variable_value_t.len (which is unsigned:28). Additionally, there is at least one case when it is not possible to fix the warning properly without introducing win32-specific code: recv() on win32 uses "int len", while POSIX defines "size_t len". The ssize_t type now properly defined for 64-bit compilation with MSVC. Caught by warning C4305 (truncation from '__int64' to 'ssize_t'), on "cutoff = NGX_MAX_SIZE_T_VALUE / 10" in ngx_atosz()). Several C4334 warnings (result of 32-bit shift implicitly converted to 64 bits) were fixed by adding explicit conversions. Several C4214 warnings (nonstandard extension used: bit field types other than int) in ngx_http_script.h fixed by changing bit field types from uintptr_t to unsigned.
2016-12-24Win32: fixed some warnings reported by Borland C.Maxim Dounin1-0/+3
Most notably, warning W8012 (comparing signed and unsigned values) reported in multiple places where an unsigned value of small type (e.g., u_short) is promoted to an int and compared to an unsigned value. Warning W8072 (suspicious pointer arithmetic) disabled, it is reported when we increment base pointer in ngx_shm_alloc().
2016-12-24Win32: minimized redefinition of ssize_t.Maxim Dounin1-1/+1
All variants of GCC have ssize_t available, there is no need to redefine it.
2016-12-24Win32: minimized redefinition of intptr_t/uintptr_t.Maxim Dounin1-1/+1
These types are available with MSVC (at least since 2003, in stddef.h), all variants of GCC (in stdint.h) and Watcom C. We need to define them only for Borland C.
2016-12-24Win32: stdint.h used for MinGW GCC.Maxim Dounin1-1/+1
There is no need to restrict stdint.h only to MinGW-w64 GCC, it is available with MinGW GCC as well.
2016-12-24Win32: fixed building with newer versions of MinGW GCC.Maxim Dounin1-0/+1
Macro to indicate that off_t was defined has been changed, so we now additionally define the new one.
2016-10-05Cache: cache manager limits.Dmitry Volyntsev2-6/+6
The new parameters "manager_files", "manager_sleep" and "manager_threshold" were added to proxy_cache_path and friends. Note that ngx_path_manager_pt was changed to return ngx_msec_t instead of time_t (API change).
2016-09-15Stream: filters.Roman Arutyunyan9-0/+257
2016-08-04Always seed PRNG with PID, seconds, and milliseconds.Ruslan Ermilov4-11/+19
2016-08-04Fixed undefined behavior when left shifting signed integer.Ruslan Ermilov1-1/+1
2016-08-04Win32: added per-thread random seeding.Ruslan Ermilov1-0/+2
The change in b91bcba29351 was not enough to fix random() seeding. On Windows, the srand() seeds the PRNG only in the current thread, and worse, is not inherited from the calling thread. Due to this, worker threads were not properly seeded. Reported by Marc Bevand.
2016-06-08Fixed spelling.Otto Kekäläinen1-1/+1
2016-05-31Core: skip special buffers on writing (ticket #981).Maxim Dounin1-0/+5
A special last buffer with cl->buf->pos set to NULL can be present in a chain when writing request body if chunked encoding was used. This resulted in a NULL pointer dereference if it happened to be the only buffer left after a do...while loop iteration in ngx_write_chain_to_file(). The problem originally appeared in nginx 1.3.9 with chunked encoding support. Additionally, rev. 3832b608dc8d (nginx 1.9.13) changed the minimum number of buffers to trigger this from IOV_MAX (typically 1024) to NGX_IOVS_PREALLOCATE (typically 64). Fix is to skip such buffers in ngx_chain_to_iovec(), much like it is done in other places.
2016-05-13Improved EPOLLRDHUP handling.Valentin Bartenev2-0/+65
When it's known that the kernel supports EPOLLRDHUP, there is no need in additional recv() call to get EOF or error when the flag is absent in the event generated by the kernel. A special runtime test is done at startup to detect if EPOLLRDHUP is actually supported by the kernel because epoll_ctl() silently ignores unknown flags. With this knowledge it's now possible to drop the "ready" flag for partial read. Previously, the "ready" flag was kept until the recv() returned EOF or error. In particular, this change allows the lingering close heuristics (which relies on the "ready" flag state) to actually work on Linux, and not wait for more data in most cases. The "available" flag is now used in the read event with the semantics similar to the corresponding counter in kqueue.
2016-04-08Removed redundant "u" format specifier.Ruslan Ermilov2-2/+2
It is implied for "x" and "X".
2016-04-08Simplified ngx_unix_recv() and ngx_readv_chain().Ruslan Ermilov2-6/+2
This makes ngx_unix_recv() and ngx_udp_unix_recv() differ minimally.
2016-04-08Merged implementations of ngx_unix_recv().Valentin Bartenev1-59/+11
There's no real need in two separate implementations, with and without kqueue support.
2016-04-08Fixed small inconsistency in handling EOF among receive functions.Valentin Bartenev2-42/+41
Now all functions always drop the ready flag in this case.
2016-04-08Merged implementations of ngx_udp_unix_recv().Valentin Bartenev1-47/+4
There's no real need in two separate implementations, with and without kqueue support.
2016-04-07Fixed spelling.Josh Soref1-1/+1
2016-03-31Fixed ngx_os_signal_process() prototype.Ruslan Ermilov4-6/+6
2016-03-31Fixed ngx_pid_t formatting in ngx_sprintf() and logging.Sergey Kandaurov3-8/+8
2016-03-31Fixed logging.Sergey Kandaurov9-15/+15
2016-03-30Style.Ruslan Ermilov6-29/+29
2016-03-29Win32: replaced NGX_EXDEV with more appropriate error code.Maxim Dounin1-5/+1
Correct error code for NGX_EXDEV on Windows is ERROR_NOT_SAME_DEVICE, "The system cannot move the file to a different disk drive". Previously used ERROR_WRONG_DISK is about wrong diskette in the drive and is not appropriate. There is no real difference though, as MoveFile() is able to copy files between disk drives, and will fail with ERROR_ACCESS_DENIED when asked to copy directories. The ERROR_NOT_SAME_DEVICE error is only used by MoveFileEx() when called without the MOVEFILE_COPY_ALLOWED flag.