Mercurial > hg > nginx
view auto/cc/conf @ 8106:8852f39311de
Fixed segfault when switching off master process during upgrade.
Binary upgrades are not supported without master process, but it is,
however, possible, that nginx running with master process is asked
to upgrade binary, and the configuration file as available on disk
at this time includes "master_process off;".
If this happens, listening sockets inherited from the previous binary
will have ls[i].previous set. But the old cycle on initial process
startup, including startup after binary upgrade, is destroyed by
ngx_init_cycle() once configuration parsing is complete. As a result,
an attempt to dereference ls[i].previous in ngx_event_process_init()
accesses already freed memory.
Fix is to avoid looking into ls[i].previous if the old cycle is already
freed.
With this change it is also no longer needed to clear ls[i].previous in
worker processes, so the relevant code was removed.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 23 Nov 2022 23:48:53 +0300 |
parents | 4925a6d13746 |
children | 9bcc5cc94ff4 |
line wrap: on
line source
# Copyright (C) Igor Sysoev # Copyright (C) Nginx, Inc. LINK="\$(CC)" MAIN_LINK= MODULE_LINK="-shared" ngx_include_opt="-I " ngx_compile_opt="-c" ngx_pic_opt="-fPIC" ngx_objout="-o " ngx_binout="-o " ngx_objext="o" ngx_binext= ngx_modext=".so" ngx_long_start= ngx_long_end= ngx_regex_dirsep="\/" ngx_dirsep='/' ngx_regex_cont=' \\\ ' ngx_cont=' \ ' ngx_tab=' \ ' ngx_spacer= ngx_long_regex_cont=$ngx_regex_cont ngx_long_cont=$ngx_cont . auto/cc/name if test -n "$CFLAGS"; then CC_TEST_FLAGS="$CFLAGS $NGX_CC_OPT" case $NGX_CC_NAME in ccc) # Compaq C V6.5-207 ngx_include_opt="-I" ;; sunc) MAIN_LINK= MODULE_LINK="-G" case "$NGX_MACHINE" in i86pc) NGX_AUX=" src/os/unix/ngx_sunpro_x86.il" ;; sun4u | sun4v) NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il" ;; esac case $CPU in amd64) NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il" ;; esac ;; esac else case $NGX_CC_NAME in gcc) # gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2 # 3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2 # 4.0.0, 4.0.1, 4.1.0 . auto/cc/gcc ;; clang) # Clang C compiler . auto/cc/clang ;; icc) # Intel C++ compiler 7.1, 8.0, 8.1 . auto/cc/icc ;; sunc) # Sun C 5.7 Patch 117837-04 2005/05/11 . auto/cc/sunc ;; ccc) # Compaq C V6.5-207 . auto/cc/ccc ;; acc) # aCC: HP ANSI C++ B3910B A.03.55.02 . auto/cc/acc ;; msvc*) # MSVC++ 6.0 SP2, MSVC++ Toolkit 2003 . auto/cc/msvc ;; owc) # Open Watcom C 1.0, 1.2 . auto/cc/owc ;; bcc) # Borland C++ 5.5 . auto/cc/bcc ;; esac CC_TEST_FLAGS="$CC_TEST_FLAGS $NGX_CC_OPT" fi CFLAGS="$CFLAGS $NGX_CC_OPT" NGX_TEST_LD_OPT="$NGX_LD_OPT" if [ "$NGX_PLATFORM" != win32 ]; then if test -n "$NGX_LD_OPT"; then ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\" ngx_feature_name= ngx_feature_run=no ngx_feature_incs= ngx_feature_path= ngx_feature_libs= ngx_feature_test= . auto/feature if [ $ngx_found = no ]; then echo $0: error: the invalid value in --with-ld-opt=\"$NGX_LD_OPT\" echo exit 1 fi fi ngx_feature="-Wl,-E switch" ngx_feature_name= ngx_feature_run=no ngx_feature_incs= ngx_feature_path= ngx_feature_libs=-Wl,-E ngx_feature_test= . auto/feature if [ $ngx_found = yes ]; then MAIN_LINK="-Wl,-E" fi if [ "$NGX_CC_NAME" = "sunc" ]; then echo "checking for gcc builtin atomic operations ... disabled" else ngx_feature="gcc builtin atomic operations" ngx_feature_name=NGX_HAVE_GCC_ATOMIC ngx_feature_run=yes ngx_feature_incs= ngx_feature_path= ngx_feature_libs= ngx_feature_test="long n = 0; if (!__sync_bool_compare_and_swap(&n, 0, 1)) return 1; if (__sync_fetch_and_add(&n, 1) != 1) return 1; if (n != 2) return 1; __sync_synchronize();" . auto/feature fi if [ "$NGX_CC_NAME" = "ccc" ]; then echo "checking for C99 variadic macros ... disabled" else ngx_feature="C99 variadic macros" ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS" ngx_feature_run=yes ngx_feature_incs="#include <stdio.h> #define var(dummy, ...) sprintf(__VA_ARGS__)" ngx_feature_path= ngx_feature_libs= ngx_feature_test="char buf[30]; buf[0] = '0'; var(0, buf, \"%d\", 1); if (buf[0] != '1') return 1" . auto/feature fi ngx_feature="gcc variadic macros" ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS" ngx_feature_run=yes ngx_feature_incs="#include <stdio.h> #define var(dummy, args...) sprintf(args)" ngx_feature_path= ngx_feature_libs= ngx_feature_test="char buf[30]; buf[0] = '0'; var(0, buf, \"%d\", 1); if (buf[0] != '1') return 1" . auto/feature ngx_feature="gcc builtin 64 bit byteswap" ngx_feature_name="NGX_HAVE_GCC_BSWAP64" ngx_feature_run=no ngx_feature_incs= ngx_feature_path= ngx_feature_libs= ngx_feature_test="if (__builtin_bswap64(0)) return 1" . auto/feature # ngx_feature="inline" # ngx_feature_name= # ngx_feature_run=no # ngx_feature_incs="int inline f(void) { return 1 }" # ngx_feature_path= # ngx_feature_libs= # ngx_feature_test= # . auto/feature # # if [ $ngx_found = yes ]; then # fi fi