From 1f2121b5464c2f405dd0af1aa1ec532925bd9c64 Mon Sep 17 00:00:00 2001 From: "Yichun Zhang (agentzh)" Date: Sat, 5 Aug 2017 16:43:36 -0700 Subject: [PATCH] removed patches for the nginx 1.13.2 core. --- ....13.2-always_enable_cc_feature_tests.patch | 11 - .../nginx-1.13.2-balancer_status_code.patch | 27 - ...inx-1.13.2-builtin_error_page_footer.patch | 13 - patches/nginx-1.13.2-cache_manager_exit.patch | 19 - .../nginx-1.13.2-delayed_posted_events.patch | 98 -- patches/nginx-1.13.2-dtrace.patch | 1159 ----------------- ...13.2-gcc-maybe-uninitialized-warning.patch | 11 - patches/nginx-1.13.2-hash_overflow.patch | 20 - .../nginx-1.13.2-intercept_error_log.patch | 60 - .../nginx-1.13.2-larger_max_error_str.patch | 13 - .../nginx-1.13.2-log_escape_non_ascii.patch | 117 -- patches/nginx-1.13.2-no_Werror.patch | 36 - patches/nginx-1.13.2-no_error_pages.patch | 90 -- patches/nginx-1.13.2-no_pool.patch | 587 --------- patches/nginx-1.13.2-pcre_conf_opt.patch | 26 - ...ginx-1.13.2-privileged_agent_process.patch | 211 --- .../nginx-1.13.2-proxy_host_port_vars.patch | 19 - ...inx-1.13.2-safe_resolver_ipv6_option.patch | 55 - patches/nginx-1.13.2-server_header.patch | 26 - ...-1.13.2-setting_args_invalidates_uri.patch | 44 - ...-1.13.2-single_process_graceful_exit.patch | 53 - patches/nginx-1.13.2-slab_defrag.patch | 138 -- patches/nginx-1.13.2-ssl_cert_cb_yield.patch | 42 - .../nginx-1.13.2-ssl_pending_session.patch | 16 - .../nginx-1.13.2-upstream_pipelining.patch | 23 - ...nginx-1.13.2-upstream_timeout_fields.patch | 121 -- 26 files changed, 3035 deletions(-) delete mode 100644 patches/nginx-1.13.2-always_enable_cc_feature_tests.patch delete mode 100644 patches/nginx-1.13.2-balancer_status_code.patch delete mode 100644 patches/nginx-1.13.2-builtin_error_page_footer.patch delete mode 100644 patches/nginx-1.13.2-cache_manager_exit.patch delete mode 100644 patches/nginx-1.13.2-delayed_posted_events.patch delete mode 100644 patches/nginx-1.13.2-dtrace.patch delete mode 100644 patches/nginx-1.13.2-gcc-maybe-uninitialized-warning.patch delete mode 100644 patches/nginx-1.13.2-hash_overflow.patch delete mode 100644 patches/nginx-1.13.2-intercept_error_log.patch delete mode 100644 patches/nginx-1.13.2-larger_max_error_str.patch delete mode 100644 patches/nginx-1.13.2-log_escape_non_ascii.patch delete mode 100644 patches/nginx-1.13.2-no_Werror.patch delete mode 100644 patches/nginx-1.13.2-no_error_pages.patch delete mode 100644 patches/nginx-1.13.2-no_pool.patch delete mode 100644 patches/nginx-1.13.2-pcre_conf_opt.patch delete mode 100644 patches/nginx-1.13.2-privileged_agent_process.patch delete mode 100644 patches/nginx-1.13.2-proxy_host_port_vars.patch delete mode 100644 patches/nginx-1.13.2-safe_resolver_ipv6_option.patch delete mode 100644 patches/nginx-1.13.2-server_header.patch delete mode 100644 patches/nginx-1.13.2-setting_args_invalidates_uri.patch delete mode 100644 patches/nginx-1.13.2-single_process_graceful_exit.patch delete mode 100644 patches/nginx-1.13.2-slab_defrag.patch delete mode 100644 patches/nginx-1.13.2-ssl_cert_cb_yield.patch delete mode 100644 patches/nginx-1.13.2-ssl_pending_session.patch delete mode 100644 patches/nginx-1.13.2-upstream_pipelining.patch delete mode 100644 patches/nginx-1.13.2-upstream_timeout_fields.patch diff --git a/patches/nginx-1.13.2-always_enable_cc_feature_tests.patch b/patches/nginx-1.13.2-always_enable_cc_feature_tests.patch deleted file mode 100644 index f34035d..0000000 --- a/patches/nginx-1.13.2-always_enable_cc_feature_tests.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- nginx-1.13.2/auto/cc/conf 2015-10-30 22:47:50.000000000 +0800 -+++ nginx-1.13.2-patched/auto/cc/conf 2015-11-02 12:23:05.385156987 +0800 -@@ -136,7 +136,7 @@ fi - CFLAGS="$CFLAGS $NGX_CC_OPT" - NGX_TEST_LD_OPT="$NGX_LD_OPT" - --if [ "$NGX_PLATFORM" != win32 ]; then -+if [ 1 ]; then - - if test -n "$NGX_LD_OPT"; then - ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\" diff --git a/patches/nginx-1.13.2-balancer_status_code.patch b/patches/nginx-1.13.2-balancer_status_code.patch deleted file mode 100644 index ea40525..0000000 --- a/patches/nginx-1.13.2-balancer_status_code.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c -index 0f6b3ae..56d44fc 100644 ---- a/src/http/ngx_http_upstream.c -+++ b/src/http/ngx_http_upstream.c -@@ -1368,6 +1368,11 @@ ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u) - return; - } - -+ if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { -+ ngx_http_upstream_finalize_request(r, u, rc); -+ return; -+ } -+ - u->state->peer = u->peer.name; - - if (rc == NGX_BUSY) { -diff --git a/src/http/ngx_http_upstream.h b/src/http/ngx_http_upstream.h -index b288f28..9b60e12 100644 ---- a/src/http/ngx_http_upstream.h -+++ b/src/http/ngx_http_upstream.h -@@ -418,5 +418,6 @@ extern ngx_module_t ngx_http_upstream_module; - extern ngx_conf_bitmask_t ngx_http_upstream_cache_method_mask[]; - extern ngx_conf_bitmask_t ngx_http_upstream_ignore_headers_masks[]; - -+#define HAVE_BALANCER_STATUS_CODE_PATCH - - #endif /* _NGX_HTTP_UPSTREAM_H_INCLUDED_ */ diff --git a/patches/nginx-1.13.2-builtin_error_page_footer.patch b/patches/nginx-1.13.2-builtin_error_page_footer.patch deleted file mode 100644 index 2212ab4..0000000 --- a/patches/nginx-1.13.2-builtin_error_page_footer.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/src/http/ngx_http_special_response.c b/src/http/ngx_http_special_response.c -index 64e5acd..f5374f6 100644 ---- a/src/http/ngx_http_special_response.c -+++ b/src/http/ngx_http_special_response.c -@@ -26,7 +26,7 @@ static u_char ngx_http_error_full_tail[] = - - - static u_char ngx_http_error_tail[] = --"
nginx
" CRLF -+"
openresty
" CRLF - "" CRLF - "" CRLF - ; diff --git a/patches/nginx-1.13.2-cache_manager_exit.patch b/patches/nginx-1.13.2-cache_manager_exit.patch deleted file mode 100644 index f1f81da..0000000 --- a/patches/nginx-1.13.2-cache_manager_exit.patch +++ /dev/null @@ -1,19 +0,0 @@ -# HG changeset patch -# User Yichun Zhang -# Date 1383598130 28800 -# Node ID f64218e1ac963337d84092536f588b8e0d99bbaa -# Parent dea321e5c0216efccbb23e84bbce7cf3e28f130c -Cache: gracefully exit the cache manager process. - -diff -r dea321e5c021 -r f64218e1ac96 src/os/unix/ngx_process_cycle.c ---- a/src/os/unix/ngx_process_cycle.c Thu Oct 31 18:23:49 2013 +0400 -+++ b/src/os/unix/ngx_process_cycle.c Mon Nov 04 12:48:50 2013 -0800 -@@ -1335,7 +1335,7 @@ - - if (ngx_terminate || ngx_quit) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); -- exit(0); -+ ngx_worker_process_exit(cycle); - } - - if (ngx_reopen) { diff --git a/patches/nginx-1.13.2-delayed_posted_events.patch b/patches/nginx-1.13.2-delayed_posted_events.patch deleted file mode 100644 index 6875843..0000000 --- a/patches/nginx-1.13.2-delayed_posted_events.patch +++ /dev/null @@ -1,98 +0,0 @@ -diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c -index 57af8132..4853945f 100644 ---- a/src/event/ngx_event.c -+++ b/src/event/ngx_event.c -@@ -196,6 +196,9 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle) - ngx_uint_t flags; - ngx_msec_t timer, delta; - -+ ngx_queue_t *q; -+ ngx_event_t *ev; -+ - if (ngx_timer_resolution) { - timer = NGX_TIMER_INFINITE; - flags = 0; -@@ -215,6 +218,13 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle) - #endif - } - -+ if (!ngx_queue_empty(&ngx_posted_delayed_events)) { -+ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, -+ "posted delayed event queue not empty" -+ " making poll timeout 0"); -+ timer = 0; -+ } -+ - if (ngx_use_accept_mutex) { - if (ngx_accept_disabled > 0) { - ngx_accept_disabled--; -@@ -257,6 +267,35 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle) - } - - ngx_event_process_posted(cycle, &ngx_posted_events); -+ -+ while (!ngx_queue_empty(&ngx_posted_delayed_events)) { -+ q = ngx_queue_head(&ngx_posted_delayed_events); -+ -+ ev = ngx_queue_data(q, ngx_event_t, queue); -+ if (ev->delayed) { -+ /* start of newly inserted nodes */ -+ for (/* void */; -+ q != ngx_queue_sentinel(&ngx_posted_delayed_events); -+ q = ngx_queue_next(q)) -+ { -+ ev = ngx_queue_data(q, ngx_event_t, queue); -+ ev->delayed = 0; -+ -+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, -+ "skipping delayed posted event %p," -+ " till next iteration", ev); -+ } -+ -+ break; -+ } -+ -+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, -+ "delayed posted event %p", ev); -+ -+ ngx_delete_posted_event(ev); -+ -+ ev->handler(ev); -+ } - } - - -@@ -600,6 +639,7 @@ ngx_event_process_init(ngx_cycle_t *cycle) - - ngx_queue_init(&ngx_posted_accept_events); - ngx_queue_init(&ngx_posted_events); -+ ngx_queue_init(&ngx_posted_delayed_events); - - if (ngx_event_timer_init(cycle->log) == NGX_ERROR) { - return NGX_ERROR; -diff --git a/src/event/ngx_event_posted.c b/src/event/ngx_event_posted.c -index d851f3d1..b6cea009 100644 ---- a/src/event/ngx_event_posted.c -+++ b/src/event/ngx_event_posted.c -@@ -12,6 +12,7 @@ - - ngx_queue_t ngx_posted_accept_events; - ngx_queue_t ngx_posted_events; -+ngx_queue_t ngx_posted_delayed_events; - - - void -diff --git a/src/event/ngx_event_posted.h b/src/event/ngx_event_posted.h -index 145d30fe..6c388553 100644 ---- a/src/event/ngx_event_posted.h -+++ b/src/event/ngx_event_posted.h -@@ -43,6 +43,9 @@ void ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted); - - extern ngx_queue_t ngx_posted_accept_events; - extern ngx_queue_t ngx_posted_events; -+extern ngx_queue_t ngx_posted_delayed_events; -+ -+#define HAVE_POSTED_DELAYED_EVENTS_PATCH - - - #endif /* _NGX_EVENT_POSTED_H_INCLUDED_ */ diff --git a/patches/nginx-1.13.2-dtrace.patch b/patches/nginx-1.13.2-dtrace.patch deleted file mode 100644 index 80a674a..0000000 --- a/patches/nginx-1.13.2-dtrace.patch +++ /dev/null @@ -1,1159 +0,0 @@ -diff --git a/README b/README -index 2f68e14e..262822a5 100644 ---- a/README -+++ b/README -@@ -1,3 +1,38 @@ -+This is an Nginx fork that adds dtrace USDT probes. - --Documentation is available at http://nginx.org -+Installation: -+ -+ ./configure --with-dtrace-probes \ -+ --with-dtrace=/usr/sbin/dtrace \ -+ ... -+ make -+ make install -+ -+Usage on Linux (with systemtap): -+ -+ # make the stap-nginx script visiable in your PATH -+ export PATH=/usr/local/nginx/sbin:$PATH -+ -+ # list all the static probes available in your nginx -+ stap-nginx -L 'process("nginx").mark("*")' -+ -+ # run the test.stp file -+ stap-nginx test.stp -+ -+Sample test.stp file: -+ -+ probe begin -+ { -+ print("Tracing. Hit CTRL-C to stop.\n") -+ } -+ -+ probe process("nginx").mark("http-subrequest-start") -+ { -+ printf("uri: %s?%s\n", ngx_http_req_uri($arg1), -+ ngx_http_req_args($arg1)) -+ } -+ -+For now, only tested on Solaris 11 Express and Fedora Linux 17. -+ -+The original Nginx documentation is available at http://nginx.org - -diff --git a/auto/install b/auto/install -index d884487a..c5027679 100644 ---- a/auto/install -+++ b/auto/install -@@ -16,6 +16,20 @@ END - fi - - -+case ".$NGX_STAP_NGX_PATH" in -+ ./*) -+ ;; -+ -+ .) -+ NGX_STAP_NGX_PATH=$NGX_PREFIX/sbin/stap-nginx -+ ;; -+ -+ *) -+ NGX_STAP_NGX_PATH=$NGX_PREFIX/$NGX_STAP_NGX_PATH -+ ;; -+esac -+ -+ - case ".$NGX_SBIN_PATH" in - ./*) - ;; -@@ -61,6 +75,16 @@ case ".$NGX_PID_PATH" in - esac - - -+case ".$NGX_TAPSET_PREFIX" in -+ ./* | .) -+ ;; -+ -+ *) -+ NGX_TAPSET_PREFIX=$NGX_PREFIX/$NGX_TAPSET_PREFIX -+ ;; -+esac -+ -+ - case ".$NGX_ERROR_LOG_PATH" in - ./* | .) - ;; -@@ -158,6 +182,36 @@ install: build $NGX_INSTALL_PERL_MODULES - || cp -R $NGX_HTML '\$(DESTDIR)$NGX_PREFIX' - END - -+if [ $NGX_DTRACE = YES -a $DTRACE_FROM_SYSTEMTAP = YES ]; then -+ -+ ngx_tapset_srcs="$NGX_TAPSET_SRCS" -+ -+ cat << END >> $NGX_MAKEFILE -+ test -d '\$(DESTDIR)$NGX_TAPSET_PREFIX' || \ -+ mkdir -p '\$(DESTDIR)$NGX_TAPSET_PREFIX' -+END -+ -+ for ngx_tapset_src in $ngx_tapset_srcs -+ do -+ ngx_tapset_file=`basename $ngx_tapset_src` -+ -+ cat << END >> $NGX_MAKEFILE -+ -+ sed -e "s|NGX_SBIN_PATH|$NGX_SBIN_PATH|g" $ngx_long_cont \ -+ $ngx_tapset_src > '\$(DESTDIR)$NGX_TAPSET_PREFIX/$ngx_tapset_file' -+END -+ -+ done -+ -+ cat << END >> $NGX_MAKEFILE -+ -+ test -d '\$(DESTDIR)`dirname "$NGX_STAP_NGX_PATH"`' || \ -+ mkdir -p '\$(DESTDIR)`dirname "$NGX_STAP_NGX_PATH"`' -+ cp $NGX_OBJS/stap-nginx '\$(DESTDIR)$NGX_STAP_NGX_PATH' -+ chmod 0755 '\$(DESTDIR)$NGX_STAP_NGX_PATH' -+END -+ -+fi - - if test -n "$NGX_ERROR_LOG_PATH"; then - cat << END >> $NGX_MAKEFILE -@@ -194,6 +248,19 @@ END - done - - -+if [ $NGX_DTRACE = YES ]; then -+ cat << END >> $NGX_MAKEFILE -+ -+$NGX_OBJS${ngx_dirsep}stap-nginx: src/dtrace/stap-nginx -+ sed -e "s|NGX_TAPSET_PREFIX|$NGX_TAPSET_PREFIX|g" $ngx_long_cont \ -+ -e "s|NGX_SBIN_DIR|`dirname $NGX_SBIN_PATH`|g" $ngx_long_cont \ -+ -e "s|NGX_SBIN_PATH|$NGX_SBIN_PATH|g" $ngx_long_cont \ -+ src/dtrace/stap-nginx > $NGX_OBJS${ngx_dirsep}stap-nginx -+END -+ -+fi -+ -+ - # create Makefile - - cat << END >> Makefile -diff --git a/auto/make b/auto/make -index 7ddd1007..367a4e55 100644 ---- a/auto/make -+++ b/auto/make -@@ -27,6 +27,9 @@ LINK = $LINK - - END - -+if [ $NGX_DTRACE = YES ]; then -+ echo DTRACE = $DTRACE >> $NGX_MAKEFILE -+fi - - if test -n "$NGX_PERL_CFLAGS"; then - echo NGX_PERL_CFLAGS = $NGX_PERL_CFLAGS >> $NGX_MAKEFILE -@@ -209,6 +212,46 @@ ngx_objs=`echo $ngx_all_objs $ngx_modules_obj \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - -+ -+if [ $NGX_DTRACE = YES ]; then -+ -+ ngx_dtrace_obj=$NGX_OBJS${ngx_dirsep}ngx_dtrace_provider.$ngx_objext -+ -+ ngx_dtrace_h=$NGX_OBJS${ngx_dirsep}ngx_dtrace_provider.h -+ -+ ngx_dtrace_d=$NGX_OBJS${ngx_dirsep}dtrace_providers.d -+ -+ ngx_dtrace_providers=`echo $NGX_DTRACE_PROVIDERS \ -+ | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \ -+ -e "s/\//$ngx_regex_dirsep/g"` -+ -+ cat << END >> $NGX_MAKEFILE -+ -+all: $NGX_OBJS${ngx_dirsep}nginx${ngx_binext} -+ -+$ngx_dtrace_d: $ngx_dtrace_providers -+ cat $ngx_dtrace_providers > $ngx_dtrace_d -+ -+$ngx_dtrace_h: $ngx_dtrace_d -+ \$(DTRACE) -h -o $ngx_dtrace_h -s $ngx_dtrace_d -+END -+ -+ if [ $DTRACE_PROBE_OBJ = YES ]; then -+ cat << END >> $NGX_MAKEFILE -+$ngx_dtrace_obj: $ngx_dtrace_d $ngx_deps$ngx_spacer -+ \$(DTRACE) -G -o $ngx_dtrace_obj -s $ngx_dtrace_d $ngx_objs -+END -+ -+ ngx_deps="$ngx_deps$ngx_long_cont$ngx_dtrace_obj" -+ ngx_objs="$ngx_objs$ngx_long_cont$ngx_dtrace_obj" -+ -+ if [ "$DTRACE_FROM_SYSTEMTAP" = YES ]; then -+ ngx_deps="$ngx_deps$ngx_long_cont$NGX_OBJS${ngx_dirsep}stap-nginx" -+ fi -+ fi -+fi -+ -+ - ngx_libs= - if test -n "$NGX_LD_OPT$CORE_LIBS"; then - ngx_libs=`echo $NGX_LD_OPT $CORE_LIBS \ -diff --git a/auto/modules b/auto/modules -index be3561e6..609af7d6 100644 ---- a/auto/modules -+++ b/auto/modules -@@ -77,7 +77,8 @@ if [ $HTTP = YES ]; then - src/http/ngx_http_variables.h \ - src/http/ngx_http_script.h \ - src/http/ngx_http_upstream.h \ -- src/http/ngx_http_upstream_round_robin.h" -+ src/http/ngx_http_upstream_round_robin.h \ -+ src/http/ngx_http_probe.h" - ngx_module_srcs="src/http/ngx_http.c \ - src/http/ngx_http_core_module.c \ - src/http/ngx_http_special_response.c \ -diff --git a/auto/options b/auto/options -index 66b822a7..fb141218 100644 ---- a/auto/options -+++ b/auto/options -@@ -13,6 +13,8 @@ NGX_CONF_PATH= - NGX_ERROR_LOG_PATH= - NGX_PID_PATH= - NGX_LOCK_PATH= -+NGX_TAPSET_PREFIX= -+NGX_STAP_NGX_PATH= - NGX_USER= - NGX_GROUP= - NGX_BUILD= -@@ -22,6 +24,12 @@ CPP= - NGX_OBJS=objs - - NGX_DEBUG=NO -+NGX_DTRACE=NO -+DTRACE=dtrace -+ -+DTRACE_PROBE_OBJ=YES -+DTRACE_FROM_SYSTEMTAP=NO -+ - NGX_CC_OPT= - NGX_LD_OPT= - CPU=NO -@@ -187,6 +195,8 @@ do - --error-log-path=*) NGX_ERROR_LOG_PATH="$value";; - --pid-path=*) NGX_PID_PATH="$value" ;; - --lock-path=*) NGX_LOCK_PATH="$value" ;; -+ --tapset-prefix=*) NGX_TAPSET_PREFIX="$value" ;; -+ --stap-nginx-path=*) NGX_STAP_NGX_PATH="$value" ;; - --user=*) NGX_USER="$value" ;; - --group=*) NGX_GROUP="$value" ;; - -@@ -338,7 +348,8 @@ use the \"--with-mail_ssl_module\" option instead" - --with-ld-opt=*) NGX_LD_OPT="$value" ;; - --with-cpu-opt=*) CPU="$value" ;; - --with-debug) NGX_DEBUG=YES ;; -- -+ --with-dtrace=*) DTRACE="$value" ;; -+ --with-dtrace-probes) NGX_DTRACE=YES ;; - --without-pcre) USE_PCRE=DISABLED ;; - --with-pcre) USE_PCRE=YES ;; - --with-pcre=*) PCRE="$value" ;; -@@ -410,6 +421,8 @@ cat << END - --error-log-path=PATH set error log pathname - --pid-path=PATH set nginx.pid pathname - --lock-path=PATH set nginx.lock pathname -+ --tapset-prefix=PATH set systemtap tapset directory prefix -+ --stap-nginx-path=PATH set stap-nginx pathname - - --user=USER set non-privileged user for - worker processes -@@ -567,6 +580,8 @@ cat << END - --with-openssl-opt=OPTIONS set additional build options for OpenSSL - - --with-debug enable debug logging -+ --with-dtrace-probes enable dtrace USDT probes -+ --with-dtrace=PATH set dtrace utility pathname - - END - -@@ -585,6 +600,7 @@ NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf} - NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH` - NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid} - NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock} -+NGX_TAPSET_PREFIX=${NGX_TAPSET_PREFIX:-tapset} - - if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then - NGX_ERROR_LOG_PATH= -diff --git a/auto/os/darwin b/auto/os/darwin -index 429468f7..be2d78dc 100644 ---- a/auto/os/darwin -+++ b/auto/os/darwin -@@ -118,3 +118,6 @@ ngx_feature_libs= - ngx_feature_test="int32_t lock = 0; - if (!OSAtomicCompareAndSwap32Barrier(0, 1, &lock)) return 1" - . auto/feature -+ -+DTRACE_PROBE_OBJ=NO -+ -diff --git a/auto/os/freebsd b/auto/os/freebsd -index 937ca204..d76b32b6 100644 ---- a/auto/os/freebsd -+++ b/auto/os/freebsd -@@ -105,3 +105,8 @@ if [ $version -ge 701000 ]; then - echo " + cpuset_setaffinity() found" - have=NGX_HAVE_CPUSET_SETAFFINITY . auto/have - fi -+ -+if [ $NGX_DTRACE = YES ]; then -+ NGX_LD_OPT="$NGX_LD_OPT -lelf" -+fi -+ -diff --git a/auto/os/linux b/auto/os/linux -index a0c8795b..64825435 100644 ---- a/auto/os/linux -+++ b/auto/os/linux -@@ -174,3 +174,5 @@ ngx_include="sys/vfs.h"; . auto/include - - - CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" -+ -+DTRACE_FROM_SYSTEMTAP=YES -diff --git a/auto/sources b/auto/sources -index 13981474..1e61bf90 100644 ---- a/auto/sources -+++ b/auto/sources -@@ -40,10 +40,16 @@ CORE_DEPS="src/core/nginx.h \ - src/core/ngx_resolver.h \ - src/core/ngx_open_file_cache.h \ - src/core/ngx_crypt.h \ -+ src/core/ngx_core_probe.h \ - src/core/ngx_proxy_protocol.h \ - src/core/ngx_syslog.h" - - -+if [ $NGX_DTRACE = YES ]; then -+ CORE_DEPS="$CORE_DEPS objs/ngx_dtrace_provider.h" -+fi -+ -+ - CORE_SRCS="src/core/nginx.c \ - src/core/ngx_log.c \ - src/core/ngx_palloc.c \ -@@ -89,7 +95,8 @@ EVENT_DEPS="src/event/ngx_event.h \ - src/event/ngx_event_timer.h \ - src/event/ngx_event_posted.h \ - src/event/ngx_event_connect.h \ -- src/event/ngx_event_pipe.h" -+ src/event/ngx_event_pipe.h \ -+ src/event/ngx_event_probe.h" - - EVENT_SRCS="src/event/ngx_event.c \ - src/event/ngx_event_timer.c \ -@@ -253,3 +260,7 @@ NGX_WIN32_RC="src/os/win32/nginx.rc" - - - HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c -+ -+NGX_DTRACE_PROVIDERS=src/dtrace/nginx_provider.d -+ -+NGX_TAPSET_SRCS=src/dtrace/nginx.stp -diff --git a/auto/summary b/auto/summary -index 9aa776ed..d8f727db 100644 ---- a/auto/summary -+++ b/auto/summary -@@ -58,6 +58,19 @@ else - echo " nginx logs errors to stderr" - fi - -+if [ $NGX_DTRACE = YES ]; then -+ cat << END -+ nginx dtrace static probes enabled -+END -+ -+ if [ $DTRACE_FROM_SYSTEMTAP = YES ]; then -+ cat << END -+ nginx systemtap tapset prefix: "$NGX_TAPSET_PREFIX" -+ nginx systemtap wrapper script: "$NGX_STAP_NGX_PATH" -+END -+ fi -+fi -+ - cat << END - nginx http access log file: "$NGX_HTTP_LOG_PATH" - nginx http client request body temporary files: "$NGX_HTTP_CLIENT_TEMP_PATH" -diff --git a/configure b/configure -index 7e6e33a7..c4ca23c9 100755 ---- a/configure -+++ b/configure -@@ -23,6 +23,9 @@ if [ $NGX_DEBUG = YES ]; then - have=NGX_DEBUG . auto/have - fi - -+if [ $NGX_DTRACE = YES ]; then -+ have=NGX_DTRACE . auto/have -+fi - - if test -z "$NGX_PLATFORM"; then - echo "checking for OS" -diff --git a/src/core/ngx_core_probe.h b/src/core/ngx_core_probe.h -new file mode 100644 -index 00000000..1841df9c ---- /dev/null -+++ b/src/core/ngx_core_probe.h -@@ -0,0 +1,24 @@ -+#ifndef _NGX_CORE_PROBE_H_INCLUDED_ -+#define _NGX_CORE_PROBE_H_INCLUDED_ -+ -+ -+#include -+#include -+#include -+ -+ -+#if (NGX_DTRACE) -+ -+#include -+ -+#define ngx_core_probe_create_pool_done(pool, size) \ -+ NGINX_CREATE_POOL_DONE(pool, size) -+ -+#else /* !(NGX_DTRACE) */ -+ -+#define ngx_core_probe_create_pool_done(pool, size) -+ -+#endif -+ -+ -+#endif /* _NGX_CORE_PROBE_H_INCLUDED_ */ -diff --git a/src/core/ngx_palloc.c b/src/core/ngx_palloc.c -index d3044ac9..d62ac45f 100644 ---- a/src/core/ngx_palloc.c -+++ b/src/core/ngx_palloc.c -@@ -7,6 +7,7 @@ - - #include - #include -+#include - - - static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size, -@@ -39,6 +40,8 @@ ngx_create_pool(size_t size, ngx_log_t *log) - p->cleanup = NULL; - p->log = log; - -+ ngx_core_probe_create_pool_done(p, size); -+ - return p; - } - -diff --git a/src/dtrace/nginx.stp b/src/dtrace/nginx.stp -new file mode 100644 -index 00000000..e824dafe ---- /dev/null -+++ b/src/dtrace/nginx.stp -@@ -0,0 +1,299 @@ -+/* tapset for nginx */ -+ -+ -+function ngx_indent(n, delta) -+{ -+ s = "" -+ for (i = 0; i < n; i++) { -+ s .= delta -+ } -+ -+ return s -+} -+ -+ -+function ngx_http_subreq_depth(r) -+{ -+ depth = 0 -+ -+ for (pr = @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->parent; -+ pr != 0; -+ pr = @cast(pr, "ngx_http_request_t", "NGX_SBIN_PATH")->parent) -+ { -+ depth++ -+ } -+ -+ return depth -+} -+ -+ -+function ngx_http_req_parent(r) -+{ -+ return @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->parent -+} -+ -+ -+/* retrieve the request uri string from the ngx_http_request_t pointer */ -+function ngx_http_req_uri(r) -+{ -+ len = @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->uri->len -+ -+ if (len == 0) { -+ return "" -+ } -+ -+ return user_string_n(@cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->uri->data, len) -+} -+ -+ -+/* retrieve the request query string from the ngx_http_request_t pointer */ -+function ngx_http_req_args(r) -+{ -+ len = @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->args->len -+ -+ if (len == 0) { -+ return "" -+ } -+ -+ return user_string_n(@cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->args->data, len) -+} -+ -+ -+/* retrieve the first command name (or directive name) from -+ * the ngx_module_t pointer */ -+function ngx_http_module_cmd(m) -+{ -+ cmds = @cast(m, "ngx_module_t", "NGX_SBIN_PATH")->commands -+ if (cmds == 0) { -+ return "" -+ } -+ -+ len = @cast(cmds, "ngx_command_t", "NGX_SBIN_PATH")->name->len -+ -+ if (len == 0) { -+ return "" -+ } -+ -+ return user_string_n(@cast(cmds, "ngx_command_t", "NGX_SBIN_PATH")->name->data, len) -+} -+ -+ -+function ngx_chain_buf(cl) -+{ -+ return @cast(cl, "ngx_chain_t", "NGX_SBIN_PATH")->buf -+} -+ -+ -+function ngx_chain_next(cl) -+{ -+ return @cast(cl, "ngx_chain_t", "NGX_SBIN_PATH")->next -+} -+ -+function ngx_buf_tag(b) -+{ -+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->tag -+} -+ -+function ngx_buf_in_memory(b) -+{ -+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->temporary -+ || @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->memory -+ || @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->mmap -+} -+ -+ -+function ngx_buf_pos(b) -+{ -+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->pos -+} -+ -+ -+function ngx_buf_file_pos(b) -+{ -+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->file_pos -+} -+ -+ -+function ngx_buf_last(b) -+{ -+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->last -+} -+ -+ -+function ngx_buf_file_last(b) -+{ -+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->file_last -+} -+ -+ -+function ngx_buf_end(b) -+{ -+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->end -+} -+ -+ -+function ngx_buf_in_file(b) -+{ -+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->in_file -+} -+ -+ -+function ngx_buf_last_buf(b) -+{ -+ return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->last_buf -+} -+ -+ -+function ngx_buf_last_in_chain(b) -+{ -+ return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->last_in_chain -+} -+ -+ -+function ngx_buf_sync(b) -+{ -+ return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->sync -+} -+ -+ -+function ngx_buf_flush(b) -+{ -+ return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->flush -+} -+ -+ -+function ngx_buf_size(b) -+{ -+ if (ngx_buf_in_memory(b)) { -+ return ngx_buf_last(b) - ngx_buf_pos(b) -+ } -+ -+ return ngx_buf_file_last(b) - ngx_buf_file_pos(b) -+} -+ -+ -+function ngx_buf_data(b) -+{ -+ return user_string_n(ngx_buf_pos(b), ngx_buf_last(b) - ngx_buf_pos(b)) -+} -+ -+ -+function ngx_chain_writer_ctx_out(ctx) -+{ -+ return @cast(c, "ngx_chain_writer_ctx_t", "NGX_SBIN_PATH")->out -+} -+ -+ -+function ngx_chain_dump:string (input) -+{ -+ if (input == 0) { -+ return "NULL" -+ } -+ -+ out = "" -+ cl = input -+ while (cl) { -+ buf = ngx_chain_buf(cl) -+ -+ if (ngx_buf_in_memory(buf)) { -+ out .= sprintf("[%s]", text_str(ngx_buf_data(buf))) -+ -+ } else { -+ out .= "\"\"" -+ } -+ -+ if (ngx_buf_in_file(buf)) { -+ out .= sprintf("", ngx_buf_file_pos(buf), -+ ngx_buf_file_last(buf)) -+ } -+ -+ if (ngx_buf_last_buf(buf)) { -+ out .= "" -+ } -+ -+ if (ngx_buf_last_in_chain(buf)) { -+ out .= "" -+ } -+ -+ if (ngx_buf_sync(buf)) { -+ out .= "" -+ } -+ -+ if (ngx_buf_flush(buf)) { -+ out .= "" -+ } -+ -+ tag = ngx_buf_tag(buf) -+ if (tag) { -+ out .= sprintf("", tag) -+ } -+ -+ cl = ngx_chain_next(cl) -+ if (cl) { -+ out .= " " -+ } -+ } -+ return out -+} -+ -+ -+function ngx_pool_cleanup_file_name(c) -+{ -+ return user_string(@cast(c, "ngx_pool_cleanup_file_t", "NGX_SBIN_PATH")->name) -+} -+ -+ -+function ngx_http_req_content_length(r) -+{ -+ return @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->headers_in->content_length_n -+} -+ -+ -+function ngx_http_req_body_temp_file_name(r) -+{ -+ rb = @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->request_body -+ if (!rb) { -+ return "" -+ } -+ -+ tf = @cast(rb, "ngx_http_request_body_t", "NGX_SBIN_PATH")->temp_file -+ if (!tf) { -+ return "" -+ } -+ -+ len = @cast(tf, "ngx_temp_file_t", "NGX_SBIN_PATH")->file->name->len -+ -+ return user_string_n(@cast(tf, "ngx_temp_file_t", "NGX_SBIN_PATH")->file->name->data, len) -+} -+ -+ -+function ngx_table_elt_key(e) -+{ -+ len = @cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->key->len -+ -+ return user_string_n(@cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->key->data, len) -+} -+ -+ -+function ngx_table_elt_value(e) -+{ -+ len = @cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->value->len -+ -+ return user_string_n(@cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->value->data, len) -+} -+ -+ -+function ngx_iovec_dump:string (iov, iovcnt) { -+ out = "" -+ for (i = 0; i < iovcnt; i++) { -+ out .= sprintf("\"%s\"(%p)", text_str(user_string_n( -+ @cast(iov, "struct iovec")[i]->iov_base, -+ @cast(iov, "struct iovec")[i]->iov_len) -+ ), @cast(iov, "struct iovec")[i]->iov_base) -+ if (i != iovcnt - 1) { -+ out .= " " -+ } -+ } -+ return out -+} -+ -diff --git a/src/dtrace/nginx_provider.d b/src/dtrace/nginx_provider.d -new file mode 100644 -index 00000000..435adf47 ---- /dev/null -+++ b/src/dtrace/nginx_provider.d -@@ -0,0 +1,39 @@ -+typedef struct { int dummy; } ngx_str_t; -+typedef int64_t ngx_int_t; -+typedef uint64_t ngx_uint_t; -+typedef ngx_uint_t ngx_msec_t; -+typedef struct { int dummy; } ngx_module_t; -+typedef struct { int dummy; } ngx_http_module_t; -+typedef struct { int dummy; } ngx_table_elt_t; -+typedef struct { int dummy; } ngx_event_t; -+typedef struct { int dummy; } ngx_pool_t; -+typedef char unsigned u_char; -+ -+ -+provider nginx { -+ /* probes for subrequests */ -+ probe http__subrequest__cycle(void *pr, ngx_str_t *uri, ngx_str_t *args); -+ probe http__subrequest__start(void *r); -+ probe http__subrequest__finalize_writing(void *r); -+ probe http__subrequest__finalize_nonactive(void *r); -+ probe http__subrequest__wake__parent(void *r); -+ probe http__subrequest__done(void *r); -+ probe http__subrequest__post__start(void *r, ngx_int_t rc); -+ probe http__subrequest__post__done(void *r, ngx_int_t rc); -+ probe http__module__post__config(ngx_module_t *m); -+ probe http__read__body__done(void *r); -+ probe http__read__req__line__done(void *r); -+ probe http__read__req__header__done(void *r, ngx_table_elt_t *h); -+ probe timer__add(ngx_event_t *ev, ngx_msec_t timer); -+ probe timer__del(ngx_event_t *ev); -+ probe timer__expire(ngx_event_t *ev); -+ probe create__pool__done(ngx_pool_t *pool, size_t size); -+}; -+ -+ -+#pragma D attributes Evolving/Evolving/Common provider nginx provider -+#pragma D attributes Private/Private/Unknown provider nginx module -+#pragma D attributes Private/Private/Unknown provider nginx function -+#pragma D attributes Private/Private/Common provider nginx name -+#pragma D attributes Evolving/Evolving/Common provider nginx args -+ -diff --git a/src/dtrace/stap-nginx b/src/dtrace/stap-nginx -new file mode 100644 -index 00000000..1bca4cfb ---- /dev/null -+++ b/src/dtrace/stap-nginx -@@ -0,0 +1,6 @@ -+#!/bin/sh -+ -+PATH="NGX_SBIN_DIR:$PATH" -+export PATH -+exec stap -d "NGX_SBIN_PATH" -I "NGX_TAPSET_PREFIX" "$@" -+ -diff --git a/src/event/ngx_event_probe.h b/src/event/ngx_event_probe.h -new file mode 100644 -index 00000000..b7b27496 ---- /dev/null -+++ b/src/event/ngx_event_probe.h -@@ -0,0 +1,32 @@ -+#ifndef _NGX_EVENT_PROBE_H_INCLUDED_ -+#define _NGX_EVENT_PROBE_H_INCLUDED_ -+ -+ -+#include -+#include -+#include -+ -+ -+#if (NGX_DTRACE) -+ -+#include -+ -+#define ngx_event_probe_timer_add(ev, timer) \ -+ NGINX_TIMER_ADD(ev, timer) -+ -+#define ngx_event_probe_timer_del(ev) \ -+ NGINX_TIMER_DEL(ev) -+ -+#define ngx_event_probe_timer_expire(ev) \ -+ NGINX_TIMER_EXPIRE(ev) -+ -+#else /* !(NGX_DTRACE) */ -+ -+#define ngx_event_probe_timer_add(ev, timer) -+#define ngx_event_probe_timer_del(ev) -+#define ngx_event_probe_timer_expire(ev) -+ -+#endif -+ -+ -+#endif /* _NGX_EVENT_PROBE_H_INCLUDED_ */ -diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c -index 698b88fa..591558dc 100644 ---- a/src/event/ngx_event_timer.c -+++ b/src/event/ngx_event_timer.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - - - ngx_rbtree_t ngx_event_timer_rbtree; -@@ -91,6 +92,8 @@ ngx_event_expire_timers(void) - - ev->timedout = 1; - -+ ngx_event_probe_timer_expire(ev); -+ - ev->handler(ev); - } - } -@@ -124,3 +127,19 @@ ngx_event_no_timers_left(void) - - return NGX_OK; - } -+ -+ -+#if (NGX_DTRACE) -+void -+ngx_event_probe_timer_add_helper(ngx_event_t *ev, ngx_msec_t timer) -+{ -+ ngx_event_probe_timer_add(ev, timer); -+} -+ -+ -+void -+ngx_event_probe_timer_del_helper(ngx_event_t *ev) -+{ -+ ngx_event_probe_timer_del(ev); -+} -+#endif -diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h -index be81b157..c448771a 100644 ---- a/src/event/ngx_event_timer.h -+++ b/src/event/ngx_event_timer.h -@@ -25,12 +25,23 @@ void ngx_event_expire_timers(void); - ngx_int_t ngx_event_no_timers_left(void); - - -+#if (NGX_DTRACE) -+void ngx_event_probe_timer_add_helper(ngx_event_t *ev, -+ ngx_msec_t timer); -+void ngx_event_probe_timer_del_helper(ngx_event_t *ev); -+#endif -+ -+ - extern ngx_rbtree_t ngx_event_timer_rbtree; - - - static ngx_inline void - ngx_event_del_timer(ngx_event_t *ev) - { -+#if (NGX_DTRACE) -+ ngx_event_probe_timer_del_helper(ev); -+#endif -+ - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "event timer del: %d: %M", - ngx_event_ident(ev->data), ev->timer.key); -@@ -77,6 +88,10 @@ ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) - - ev->timer.key = key; - -+#if (NGX_DTRACE) -+ ngx_event_probe_timer_add_helper(ev, timer); -+#endif -+ - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "event timer add: %d: %M:%M", - ngx_event_ident(ev->data), timer, ev->timer.key); -diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c -index c036389a..0e32f3d2 100644 ---- a/src/http/ngx_http.c -+++ b/src/http/ngx_http.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - - - static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -@@ -305,6 +306,9 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) - module = cf->cycle->modules[m]->ctx; - - if (module->postconfiguration) { -+ -+ ngx_http_probe_module_post_config(ngx_modules[m]); -+ - if (module->postconfiguration(cf) != NGX_OK) { - return NGX_CONF_ERROR; - } -diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c -index 02059efd..194e62a0 100644 ---- a/src/http/ngx_http_core_module.c -+++ b/src/http/ngx_http_core_module.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - - - typedef struct { -@@ -2448,6 +2449,8 @@ ngx_http_subrequest(ngx_http_request_t *r, - ngx_http_postponed_request_t *pr, *p; - - if (r->subrequests == 0) { -+ ngx_http_probe_subrequest_cycle(r, uri, args); -+ - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "subrequests cycle while processing \"%V\"", uri); - return NGX_ERROR; -@@ -2596,6 +2599,8 @@ ngx_http_subrequest(ngx_http_request_t *r, - ngx_http_update_location_config(sr); - } - -+ ngx_http_probe_subrequest_start(sr); -+ - return ngx_http_post_request(sr, NULL); - } - -diff --git a/src/http/ngx_http_probe.h b/src/http/ngx_http_probe.h -new file mode 100644 -index 00000000..d7d2d45d ---- /dev/null -+++ b/src/http/ngx_http_probe.h -@@ -0,0 +1,75 @@ -+#ifndef _NGX_HTTP_PROBE_H_INCLUDED_ -+#define _NGX_HTTP_PROBE_H_INCLUDED_ -+ -+ -+#include -+#include -+#include -+ -+ -+#if (NGX_DTRACE) -+ -+#include -+ -+#define ngx_http_probe_subrequest_cycle(pr, uri, args) \ -+ NGINX_HTTP_SUBREQUEST_CYCLE(pr, uri, args) -+ -+#define ngx_http_probe_subrequest_start(r) \ -+ NGINX_HTTP_SUBREQUEST_START(r) -+ -+#define ngx_http_probe_subrequest_finalize_writing(r) \ -+ NGINX_HTTP_SUBREQUEST_FINALIZE_WRITING(r) -+ -+#define ngx_http_probe_subrequest_finalize_nonactive(r) \ -+ NGINX_HTTP_SUBREQUEST_FINALIZE_NONACTIVE(r) -+ -+#define ngx_http_probe_subrequest_finalize_nonactive(r) \ -+ NGINX_HTTP_SUBREQUEST_FINALIZE_NONACTIVE(r) -+ -+#define ngx_http_probe_subrequest_wake_parent(r) \ -+ NGINX_HTTP_SUBREQUEST_WAKE_PARENT(r) -+ -+#define ngx_http_probe_subrequest_done(r) \ -+ NGINX_HTTP_SUBREQUEST_DONE(r) -+ -+#define ngx_http_probe_subrequest_post_start(r, rc) \ -+ NGINX_HTTP_SUBREQUEST_POST_START(r, rc) -+ -+#define ngx_http_probe_subrequest_post_done(r, rc) \ -+ NGINX_HTTP_SUBREQUEST_POST_DONE(r, rc) -+ -+#define ngx_http_probe_module_post_config(m) \ -+ NGINX_HTTP_MODULE_POST_CONFIG(m) -+ -+#define ngx_http_probe_read_body_abort(r, reason) \ -+ NGINX_HTTP_READ_BODY_ABORT(r, reason) -+ -+#define ngx_http_probe_read_body_done(r) \ -+ NGINX_HTTP_READ_BODY_DONE(r) -+ -+#define ngx_http_probe_read_req_line_done(r) \ -+ NGINX_HTTP_READ_REQ_LINE_DONE(r) -+ -+#define ngx_http_probe_read_req_header_done(r, h) \ -+ NGINX_HTTP_READ_REQ_HEADER_DONE(r, h) -+ -+#else /* !(NGX_DTRACE) */ -+ -+#define ngx_http_probe_subrequest_cycle(pr, uri, args) -+#define ngx_http_probe_subrequest_start(r) -+#define ngx_http_probe_subrequest_finalize_writing(r) -+#define ngx_http_probe_subrequest_finalize_nonactive(r) -+#define ngx_http_probe_subrequest_wake_parent(r) -+#define ngx_http_probe_subrequest_done(r) -+#define ngx_http_probe_subrequest_post_start(r, rc) -+#define ngx_http_probe_subrequest_post_done(r, rc) -+#define ngx_http_probe_module_post_config(m) -+#define ngx_http_probe_read_body_abort(r, reason) -+#define ngx_http_probe_read_body_done(r) -+#define ngx_http_probe_read_req_line_done(r) -+#define ngx_http_probe_read_req_header_done(r, h) -+ -+#endif /* NGX_DTRACE */ -+ -+ -+#endif /* _NGX_HTTP_PROBE_H_INCLUDED_ */ -diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c -index de1b2027..887cf6cd 100644 ---- a/src/http/ngx_http_request.c -+++ b/src/http/ngx_http_request.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - - - static void ngx_http_wait_request_handler(ngx_event_t *ev); -@@ -1091,7 +1092,6 @@ ngx_http_process_request_line(ngx_event_t *rev) - } - } - -- - ngx_int_t - ngx_http_process_request_uri(ngx_http_request_t *r) - { -@@ -1348,6 +1348,8 @@ ngx_http_process_request_headers(ngx_event_t *rev) - return; - } - -+ ngx_http_probe_read_req_header_done(r, h); -+ - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http header: \"%V: %V\"", - &h->key, &h->value); -@@ -2327,7 +2329,11 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc) - } - - if (r != r->main && r->post_subrequest) { -+ ngx_http_probe_subrequest_post_start(r, rc); -+ - rc = r->post_subrequest->handler(r, r->post_subrequest->data, rc); -+ -+ ngx_http_probe_subrequest_post_done(r, rc); - } - - if (rc == NGX_ERROR -@@ -2393,6 +2399,8 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc) - - if (r->buffered || r->postponed) { - -+ ngx_http_probe_subrequest_finalize_writing(r); -+ - if (ngx_http_set_write_handler(r) != NGX_OK) { - ngx_http_terminate_request(r, 0); - } -@@ -2425,10 +2433,14 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc) - pr->postponed = pr->postponed->next; - } - -+ ngx_http_probe_subrequest_done(r); -+ - c->data = pr; - - } else { - -+ ngx_http_probe_subrequest_finalize_nonactive(r); -+ - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http finalize non-active request: \"%V?%V\"", - &r->uri, &r->args); -@@ -2440,6 +2452,8 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc) - } - } - -+ ngx_http_probe_subrequest_wake_parent(r); -+ - if (ngx_http_post_request(pr, NULL) != NGX_OK) { - r->main->count++; - ngx_http_terminate_request(r, 0); -diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c -index c4f092e5..67a8cbf9 100644 ---- a/src/http/ngx_http_request_body.c -+++ b/src/http/ngx_http_request_body.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - - - static void ngx_http_read_client_request_body_handler(ngx_http_request_t *r); -@@ -421,6 +422,8 @@ ngx_http_do_read_client_request_body(ngx_http_request_t *r) - rb->post_handler(r); - } - -+ ngx_http_probe_read_body_done(r); -+ - return NGX_OK; - } - diff --git a/patches/nginx-1.13.2-gcc-maybe-uninitialized-warning.patch b/patches/nginx-1.13.2-gcc-maybe-uninitialized-warning.patch deleted file mode 100644 index 900e837..0000000 --- a/patches/nginx-1.13.2-gcc-maybe-uninitialized-warning.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- nginx-1.13.2/src/http/ngx_http_request.c 2013-05-06 03:26:50.000000000 -0700 -+++ nginx-1.13.2-patched/src/http/ngx_http_request.c 2013-06-11 12:59:48.008321688 -0700 -@@ -1951,7 +1951,7 @@ - ngx_int_t rc; - ngx_http_connection_t *hc; - ngx_http_core_loc_conf_t *clcf; -- ngx_http_core_srv_conf_t *cscf; -+ ngx_http_core_srv_conf_t *cscf = NULL; - - hc = r->http_connection; - diff --git a/patches/nginx-1.13.2-hash_overflow.patch b/patches/nginx-1.13.2-hash_overflow.patch deleted file mode 100644 index 449d214..0000000 --- a/patches/nginx-1.13.2-hash_overflow.patch +++ /dev/null @@ -1,20 +0,0 @@ -# HG changeset patch -# User Yichun Zhang -# Date 1412276417 25200 -# Thu Oct 02 12:00:17 2014 -0700 -# Node ID 4032b992f23b054c1a2cfb0be879330d2c6708e5 -# Parent 1ff0f68d9376e3d184d65814a6372856bf65cfcd -Hash: buffer overflow might happen when exceeding the pre-configured limits. - -diff -r 1ff0f68d9376 -r 4032b992f23b src/core/ngx_hash.c ---- a/src/core/ngx_hash.c Tue Sep 30 15:50:28 2014 -0700 -+++ b/src/core/ngx_hash.c Thu Oct 02 12:00:17 2014 -0700 -@@ -312,6 +312,8 @@ ngx_hash_init(ngx_hash_init_t *hinit, ng - continue; - } - -+ size--; -+ - ngx_log_error(NGX_LOG_WARN, hinit->pool->log, 0, - "could not build optimal %s, you should increase " - "either %s_max_size: %i or %s_bucket_size: %i; " diff --git a/patches/nginx-1.13.2-intercept_error_log.patch b/patches/nginx-1.13.2-intercept_error_log.patch deleted file mode 100644 index 5de7695..0000000 --- a/patches/nginx-1.13.2-intercept_error_log.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff --git a/src/core/ngx_cycle.h b/src/core/ngx_cycle.h -index c51b7ff..4c335b9 100644 ---- a/src/core/ngx_cycle.h -+++ b/src/core/ngx_cycle.h -@@ -22,9 +22,14 @@ - #define NGX_DEBUG_POINTS_ABORT 2 - - -+#define HAVE_INTERCEPT_ERROR_LOG_PATCH -+ -+ - typedef struct ngx_shm_zone_s ngx_shm_zone_t; - - typedef ngx_int_t (*ngx_shm_zone_init_pt) (ngx_shm_zone_t *zone, void *data); -+typedef ngx_int_t (*ngx_log_intercept_pt) (ngx_log_t *log, ngx_uint_t level, -+ u_char *buf, size_t len); - - struct ngx_shm_zone_s { - void *data; -@@ -75,6 +80,10 @@ struct ngx_cycle_s { - ngx_str_t prefix; - ngx_str_t lock_file; - ngx_str_t hostname; -+ -+ ngx_log_intercept_pt intercept_error_log_handler; -+ void *intercept_error_log_data; -+ unsigned entered_logger; /* :1 */ - }; - - -diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c -index 8e9408d..ed9b11b 100644 ---- a/src/core/ngx_log.c -+++ b/src/core/ngx_log.c -@@ -112,6 +112,8 @@ ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, - ngx_uint_t wrote_stderr, debug_connection; - u_char errstr[NGX_MAX_ERROR_STR]; - -+ ngx_log_intercept_pt log_intercept = NULL; -+ - last = errstr + NGX_MAX_ERROR_STR; - - p = ngx_cpymem(errstr, ngx_cached_err_log_time.data, -@@ -153,6 +155,16 @@ ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, - p = last - NGX_LINEFEED_SIZE; - } - -+ if (ngx_cycle) { -+ log_intercept = ngx_cycle->intercept_error_log_handler; -+ } -+ -+ if (log_intercept && !ngx_cycle->entered_logger) { -+ ngx_cycle->entered_logger = 1; -+ log_intercept(log, level, errstr, p - errstr); -+ ngx_cycle->entered_logger = 0; -+ } -+ - ngx_linefeed(p); - - wrote_stderr = 0; diff --git a/patches/nginx-1.13.2-larger_max_error_str.patch b/patches/nginx-1.13.2-larger_max_error_str.patch deleted file mode 100644 index 8e1f071..0000000 --- a/patches/nginx-1.13.2-larger_max_error_str.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- nginx-1.13.2/src/core/ngx_log.h 2013-10-08 05:07:14.000000000 -0700 -+++ nginx-1.13.2-patched/src/core/ngx_log.h 2013-12-05 20:35:35.996236720 -0800 -@@ -64,7 +64,9 @@ struct ngx_log_s { - }; - - --#define NGX_MAX_ERROR_STR 2048 -+#ifndef NGX_MAX_ERROR_STR -+#define NGX_MAX_ERROR_STR 4096 -+#endif - - - /*********************************/ diff --git a/patches/nginx-1.13.2-log_escape_non_ascii.patch b/patches/nginx-1.13.2-log_escape_non_ascii.patch deleted file mode 100644 index bea6e52..0000000 --- a/patches/nginx-1.13.2-log_escape_non_ascii.patch +++ /dev/null @@ -1,117 +0,0 @@ -diff --git a/src/http/modules/ngx_http_log_module.c b/src/http/modules/ngx_http_log_module.c -index 917ed55f..b769dfd3 100644 ---- a/src/http/modules/ngx_http_log_module.c -+++ b/src/http/modules/ngx_http_log_module.c -@@ -79,6 +79,8 @@ typedef struct { - time_t open_file_cache_valid; - ngx_uint_t open_file_cache_min_uses; - -+ ngx_flag_t escape_non_ascii; -+ - ngx_uint_t off; /* unsigned off:1 */ - } ngx_http_log_loc_conf_t; - -@@ -131,7 +133,8 @@ static size_t ngx_http_log_variable_getlen(ngx_http_request_t *r, - uintptr_t data); - static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); --static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size); -+static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, -+ u_char *src, size_t size); - static size_t ngx_http_log_json_variable_getlen(ngx_http_request_t *r, - uintptr_t data); - static u_char *ngx_http_log_json_variable(ngx_http_request_t *r, u_char *buf, -@@ -177,6 +180,13 @@ static ngx_command_t ngx_http_log_commands[] = { - 0, - NULL }, - -+ { ngx_string("log_escape_non_ascii"), -+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, -+ ngx_conf_set_flag_slot, -+ NGX_HTTP_LOC_CONF_OFFSET, -+ offsetof(ngx_http_log_loc_conf_t, escape_non_ascii), -+ NULL }, -+ - ngx_null_command - }; - -@@ -935,6 +945,7 @@ static size_t - ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data) - { - uintptr_t len; -+ ngx_http_log_loc_conf_t *lcf; - ngx_http_variable_value_t *value; - - value = ngx_http_get_indexed_variable(r, data); -@@ -943,7 +954,9 @@ ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data) - return 1; - } - -- len = ngx_http_log_escape(NULL, value->data, value->len); -+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module); -+ -+ len = ngx_http_log_escape(lcf, NULL, value->data, value->len); - - value->escape = len ? 1 : 0; - -@@ -954,6 +967,7 @@ ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data) - static u_char * - ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op) - { -+ ngx_http_log_loc_conf_t *lcf; - ngx_http_variable_value_t *value; - - value = ngx_http_get_indexed_variable(r, op->data); -@@ -967,16 +981,18 @@ ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op) - return ngx_cpymem(buf, value->data, value->len); - - } else { -- return (u_char *) ngx_http_log_escape(buf, value->data, value->len); -+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module); -+ return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len); - } - } - - - static uintptr_t --ngx_http_log_escape(u_char *dst, u_char *src, size_t size) -+ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src, -+ size_t size) - { -- ngx_uint_t n; -- static u_char hex[] = "0123456789ABCDEF"; -+ ngx_uint_t n; -+ static u_char hex[] = "0123456789ABCDEF"; - - static uint32_t escape[] = { - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ -@@ -996,6 +1012,12 @@ ngx_http_log_escape(u_char *dst, u_char *src, size_t size) - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - }; - -+ if (lcf->escape_non_ascii) { -+ ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4); -+ -+ } else { -+ ngx_memzero(&escape[4], sizeof(uint32_t) * 4); -+ } - - if (dst == NULL) { - -@@ -1120,6 +1142,7 @@ ngx_http_log_create_loc_conf(ngx_conf_t *cf) - } - - conf->open_file_cache = NGX_CONF_UNSET_PTR; -+ conf->escape_non_ascii = NGX_CONF_UNSET; - - return conf; - } -@@ -1135,6 +1158,8 @@ ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) - ngx_http_log_fmt_t *fmt; - ngx_http_log_main_conf_t *lmcf; - -+ ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1); -+ - if (conf->open_file_cache == NGX_CONF_UNSET_PTR) { - - conf->open_file_cache = prev->open_file_cache; diff --git a/patches/nginx-1.13.2-no_Werror.patch b/patches/nginx-1.13.2-no_Werror.patch deleted file mode 100644 index 866028d..0000000 --- a/patches/nginx-1.13.2-no_Werror.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff -urp nginx-1.13.2/auto/cc/clang nginx-1.13.2-patched/auto/cc/clang ---- nginx-1.13.2/auto/cc/clang 2014-03-04 03:39:24.000000000 -0800 -+++ nginx-1.13.2-patched/auto/cc/clang 2014-03-13 20:54:26.241413360 -0700 -@@ -89,7 +89,7 @@ CFLAGS="$CFLAGS -Wconditional-uninitiali - CFLAGS="$CFLAGS -Wno-unused-parameter" - - # stop on warning --CFLAGS="$CFLAGS -Werror" -+#CFLAGS="$CFLAGS -Werror" - - # debug - CFLAGS="$CFLAGS -g" -diff -urp nginx-1.13.2/auto/cc/gcc nginx-1.13.2-patched/auto/cc/gcc ---- nginx-1.13.2/auto/cc/gcc 2014-03-04 03:39:24.000000000 -0800 -+++ nginx-1.13.2-patched/auto/cc/gcc 2014-03-13 20:54:13.301355329 -0700 -@@ -168,7 +168,7 @@ esac - - - # stop on warning --CFLAGS="$CFLAGS -Werror" -+#CFLAGS="$CFLAGS -Werror" - - # debug - CFLAGS="$CFLAGS -g" -diff -urp nginx-1.13.2/auto/cc/icc nginx-1.13.2-patched/auto/cc/icc ---- nginx-1.13.2/auto/cc/icc 2014-03-04 03:39:24.000000000 -0800 -+++ nginx-1.13.2-patched/auto/cc/icc 2014-03-13 20:54:13.301355329 -0700 -@@ -115,7 +115,7 @@ case "$NGX_ICC_VER" in - esac - - # stop on warning --CFLAGS="$CFLAGS -Werror" -+#CFLAGS="$CFLAGS -Werror" - - # debug - CFLAGS="$CFLAGS -g" diff --git a/patches/nginx-1.13.2-no_error_pages.patch b/patches/nginx-1.13.2-no_error_pages.patch deleted file mode 100644 index d6f8177..0000000 --- a/patches/nginx-1.13.2-no_error_pages.patch +++ /dev/null @@ -1,90 +0,0 @@ ---- nginx-1.13.2/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800 -+++ nginx-1.13.2-patched/src/http/ngx_http_core_module.c 2011-01-30 19:24:34.956354518 +0800 -@@ -57,6 +57,8 @@ - void *conf); - static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -+static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, -+ void *conf); - static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, -@@ -614,6 +616,14 @@ - 0, - NULL }, - -+ { ngx_string("no_error_pages"), -+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF -+ |NGX_CONF_NOARGS, -+ ngx_http_core_no_error_pages, -+ NGX_HTTP_LOC_CONF_OFFSET, -+ 0, -+ NULL }, -+ - { ngx_string("try_files"), - NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE, - ngx_http_core_try_files, -@@ -3052,7 +3062,6 @@ - * clcf->types = NULL; - * clcf->default_type = { 0, NULL }; - * clcf->error_log = NULL; -- * clcf->error_pages = NULL; - * clcf->try_files = NULL; - * clcf->client_body_path = NULL; - * clcf->regex = NULL; -@@ -3062,6 +3071,7 @@ - * clcf->gzip_proxied = 0; - */ - -+ clcf->error_pages = NGX_CONF_UNSET_PTR; - clcf->client_max_body_size = NGX_CONF_UNSET; - clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE; - clcf->client_body_timeout = NGX_CONF_UNSET_MSEC; -@@ -3250,9 +3260,7 @@ - } - } - -- if (conf->error_pages == NULL && prev->error_pages) { -- conf->error_pages = prev->error_pages; -- } -+ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL); - - ngx_conf_merge_str_value(conf->default_type, - prev->default_type, "text/plain"); -@@ -3988,6 +3996,10 @@ - ngx_http_compile_complex_value_t ccv; - - if (clcf->error_pages == NULL) { -+ return "conflicts with \"no_error_pages\""; -+ } -+ -+ if (clcf->error_pages == NGX_CONF_UNSET_PTR) { - clcf->error_pages = ngx_array_create(cf->pool, 4, - sizeof(ngx_http_err_page_t)); - if (clcf->error_pages == NULL) { -@@ -4095,6 +4107,25 @@ - - - static char * -+ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -+{ -+ ngx_http_core_loc_conf_t *clcf = conf; -+ -+ if (clcf->error_pages == NULL) { -+ return "is duplicate"; -+ } -+ -+ if (clcf->error_pages != NGX_CONF_UNSET_PTR) { -+ return "conflicts with \"error_page\""; -+ } -+ -+ clcf->error_pages = NULL; -+ -+ return NGX_CONF_OK; -+} -+ -+ -+static char * - ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) - { - ngx_http_core_loc_conf_t *clcf = conf; diff --git a/patches/nginx-1.13.2-no_pool.patch b/patches/nginx-1.13.2-no_pool.patch deleted file mode 100644 index 82dbd2a..0000000 --- a/patches/nginx-1.13.2-no_pool.patch +++ /dev/null @@ -1,587 +0,0 @@ -diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.13.2/src/core/nginx.h nginx-1.13.2-patched/src/core/nginx.h ---- nginx-1.13.2/src/core/nginx.h 2016-04-19 09:02:38.000000000 -0700 -+++ nginx-1.13.2-patched/src/core/nginx.h 2016-04-21 16:25:07.452944624 -0700 -@@ -10,7 +10,7 @@ - - - #define nginx_version 1013002 - #define NGINX_VERSION "1.13.2" --#define NGINX_VER "openresty/" NGINX_VERSION ".unknown" -+#define NGINX_VER "openresty/" NGINX_VERSION ".unknown (no pool)" - - #ifdef NGX_BUILD -diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.13.2/src/core/ngx_array.c nginx-1.13.2-patched/src/core/ngx_array.c ---- nginx-1.13.2/src/core/ngx_array.c 2016-04-19 09:02:38.000000000 -0700 -+++ nginx-1.13.2-patched/src/core/ngx_array.c 2016-04-21 16:25:07.453947190 -0700 -@@ -30,26 +30,30 @@ ngx_array_create(ngx_pool_t *p, ngx_uint - void - ngx_array_destroy(ngx_array_t *a) - { -- ngx_pool_t *p; -+ ngx_pool_t *p; -+ ngx_array_link_t *link; - - p = a->pool; - -- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) { -- p->d.last -= a->size * a->nalloc; -+ if (a->elts) { -+ ngx_pfree(p, a->elts); - } - -- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) { -- p->d.last = (u_char *) a; -+ for (link = a->old_elts; link; link = link->next) { -+ ngx_pfree(p, link->elts); - } -+ -+ ngx_pfree(p, a); - } - - - void * - ngx_array_push(ngx_array_t *a) - { -- void *elt, *new; -- size_t size; -- ngx_pool_t *p; -+ void *elt, *new; -+ size_t size; -+ ngx_pool_t *p; -+ ngx_array_link_t *link; - - if (a->nelts == a->nalloc) { - -@@ -59,29 +63,27 @@ ngx_array_push(ngx_array_t *a) - - p = a->pool; - -- if ((u_char *) a->elts + size == p->d.last -- && p->d.last + a->size <= p->d.end) -- { -- /* -- * the array allocation is the last in the pool -- * and there is space for new allocation -- */ -- -- p->d.last += a->size; -- a->nalloc++; -+ /* allocate a new array */ - -- } else { -- /* allocate a new array */ -+ new = ngx_palloc(p, 2 * size); -+ if (new == NULL) { -+ return NULL; -+ } - -- new = ngx_palloc(p, 2 * size); -- if (new == NULL) { -- return NULL; -- } -+ ngx_memcpy(new, a->elts, size); - -- ngx_memcpy(new, a->elts, size); -- a->elts = new; -- a->nalloc *= 2; -+ link = ngx_palloc(p, sizeof(ngx_array_link_t)); -+ if (link == NULL) { -+ ngx_pfree(p, new); -+ return NULL; - } -+ -+ link->next = a->old_elts; -+ link->elts = a->elts; -+ a->old_elts = link; -+ -+ a->elts = new; -+ a->nalloc *= 2; - } - - elt = (u_char *) a->elts + a->size * a->nelts; -@@ -95,11 +97,10 @@ void * - ngx_array_push_n(ngx_array_t *a, ngx_uint_t n) - { - void *elt, *new; -- size_t size; - ngx_uint_t nalloc; - ngx_pool_t *p; - -- size = n * a->size; -+ ngx_array_link_t *link; - - if (a->nelts + n > a->nalloc) { - -@@ -107,31 +108,27 @@ ngx_array_push_n(ngx_array_t *a, ngx_uin - - p = a->pool; - -- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last -- && p->d.last + size <= p->d.end) -- { -- /* -- * the array allocation is the last in the pool -- * and there is space for new allocation -- */ -+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc); - -- p->d.last += size; -- a->nalloc += n; -+ new = ngx_palloc(p, nalloc * a->size); -+ if (new == NULL) { -+ return NULL; -+ } - -- } else { -- /* allocate a new array */ -+ ngx_memcpy(new, a->elts, a->nelts * a->size); - -- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc); -+ link = ngx_palloc(p, sizeof(ngx_array_link_t)); -+ if (link == NULL) { -+ ngx_pfree(p, new); -+ return NULL; -+ } - -- new = ngx_palloc(p, nalloc * a->size); -- if (new == NULL) { -- return NULL; -- } -+ link->next = a->old_elts; -+ link->elts = a->elts; -+ a->old_elts = link; - -- ngx_memcpy(new, a->elts, a->nelts * a->size); -- a->elts = new; -- a->nalloc = nalloc; -- } -+ a->elts = new; -+ a->nalloc = nalloc; - } - - elt = (u_char *) a->elts + a->size * a->nelts; -diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.13.2/src/core/ngx_array.h nginx-1.13.2-patched/src/core/ngx_array.h ---- nginx-1.13.2/src/core/ngx_array.h 2016-04-19 09:02:38.000000000 -0700 -+++ nginx-1.13.2-patched/src/core/ngx_array.h 2016-04-21 16:25:07.453947190 -0700 -@@ -13,12 +13,23 @@ - #include - - -+typedef struct ngx_array_link_s ngx_array_link_t; -+ -+ -+struct ngx_array_link_s { -+ void *elts; -+ ngx_array_link_t *next; -+}; -+ -+ - typedef struct { - void *elts; - ngx_uint_t nelts; - size_t size; - ngx_uint_t nalloc; - ngx_pool_t *pool; -+ -+ ngx_array_link_t *old_elts; - } ngx_array_t; - - -@@ -40,6 +51,7 @@ ngx_array_init(ngx_array_t *array, ngx_p - array->size = size; - array->nalloc = n; - array->pool = pool; -+ array->old_elts = NULL; - - array->elts = ngx_palloc(pool, n * size); - if (array->elts == NULL) { -diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.13.2/src/core/ngx_palloc.c nginx-1.13.2-patched/src/core/ngx_palloc.c ---- nginx-1.13.2/src/core/ngx_palloc.c 2016-04-19 09:02:38.000000000 -0700 -+++ nginx-1.13.2-patched/src/core/ngx_palloc.c 2016-04-21 16:25:45.912282685 -0700 -@@ -9,34 +9,26 @@ - #include - - --static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size, -- ngx_uint_t align); --static void *ngx_palloc_block(ngx_pool_t *pool, size_t size); --static void *ngx_palloc_large(ngx_pool_t *pool, size_t size); -+static void * ngx_malloc(ngx_pool_t *pool, size_t size); - - - ngx_pool_t * - ngx_create_pool(size_t size, ngx_log_t *log) - { -- ngx_pool_t *p; -+ ngx_pool_t *p; - -- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log); -+ size = sizeof(ngx_pool_t); -+ p = ngx_alloc(size, log); - if (p == NULL) { - return NULL; - } - -- p->d.last = (u_char *) p + sizeof(ngx_pool_t); -- p->d.end = (u_char *) p + size; -- p->d.next = NULL; -- p->d.failed = 0; -+ ngx_memzero(p, size); - - size = size - sizeof(ngx_pool_t); - p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL; - - p->current = p; -- p->chain = NULL; -- p->large = NULL; -- p->cleanup = NULL; - p->log = log; - - return p; -@@ -46,8 +38,7 @@ ngx_create_pool(size_t size, ngx_log_t * - void - ngx_destroy_pool(ngx_pool_t *pool) - { -- ngx_pool_t *p, *n; -- ngx_pool_large_t *l; -+ ngx_pool_data_t *d, *n; - ngx_pool_cleanup_t *c; - - for (c = pool->cleanup; c; c = c->next) { -@@ -58,6 +49,11 @@ ngx_destroy_pool(ngx_pool_t *pool) - } - } - -+ if (pool->d == NULL) { -+ ngx_free(pool); -+ return; -+ } -+ - #if (NGX_DEBUG) - - /* -@@ -65,13 +61,9 @@ ngx_destroy_pool(ngx_pool_t *pool) - * so we cannot use this log while free()ing the pool - */ - -- for (l = pool->large; l; l = l->next) { -- ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc); -- } -- -- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) { -+ for (d = pool->d, n = d->next; ; d = n, n = n->next) { - ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0, -- "free: %p, unused: %uz", p, p->d.end - p->d.last); -+ "free: %p, unused: %d", d, 0); - - if (n == NULL) { - break; -@@ -80,171 +72,82 @@ ngx_destroy_pool(ngx_pool_t *pool) - - #endif - -- for (l = pool->large; l; l = l->next) { -- if (l->alloc) { -- ngx_free(l->alloc); -- } -- } -- -- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) { -- ngx_free(p); -+ for (d = pool->d, n = d->next; ; d = n, n = n->next) { -+ ngx_free(d->alloc); -+ ngx_free(d); - - if (n == NULL) { - break; - } - } -+ -+ pool->d = NULL; -+ ngx_free(pool); - } - - - void - ngx_reset_pool(ngx_pool_t *pool) - { -- ngx_pool_t *p; -- ngx_pool_large_t *l; -+ ngx_pool_data_t *d, *n; -+ ngx_pool_data_t *saved = NULL; - -- for (l = pool->large; l; l = l->next) { -- if (l->alloc) { -- ngx_free(l->alloc); -+ if (pool->d) { -+ for (d = pool->d, n = d->next; ; d = n, n = n->next) { -+ if (d->alloc == pool->log) { -+ saved = d; -+ continue; -+ } -+ -+ ngx_free(d->alloc); -+ ngx_free(d); -+ -+ if (n == NULL) { -+ break; -+ } - } -- } - -- for (p = pool; p; p = p->d.next) { -- p->d.last = (u_char *) p + sizeof(ngx_pool_t); -- p->d.failed = 0; -+ pool->d = saved; -+ pool->current = pool; -+ pool->chain = NULL; - } -- -- pool->current = pool; -- pool->chain = NULL; -- pool->large = NULL; - } - - - void * - ngx_palloc(ngx_pool_t *pool, size_t size) - { --#if !(NGX_DEBUG_PALLOC) -- if (size <= pool->max) { -- return ngx_palloc_small(pool, size, 1); -- } --#endif -- -- return ngx_palloc_large(pool, size); -+ return ngx_malloc(pool, size); - } - - - void * - ngx_pnalloc(ngx_pool_t *pool, size_t size) - { --#if !(NGX_DEBUG_PALLOC) -- if (size <= pool->max) { -- return ngx_palloc_small(pool, size, 0); -- } --#endif -- -- return ngx_palloc_large(pool, size); --} -- -- --static ngx_inline void * --ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align) --{ -- u_char *m; -- ngx_pool_t *p; -- -- p = pool->current; -- -- do { -- m = p->d.last; -- -- if (align) { -- m = ngx_align_ptr(m, NGX_ALIGNMENT); -- } -- -- if ((size_t) (p->d.end - m) >= size) { -- p->d.last = m + size; -- -- return m; -- } -- -- p = p->d.next; -- -- } while (p); -- -- return ngx_palloc_block(pool, size); --} -- -- --static void * --ngx_palloc_block(ngx_pool_t *pool, size_t size) --{ -- u_char *m; -- size_t psize; -- ngx_pool_t *p, *new; -- -- psize = (size_t) (pool->d.end - (u_char *) pool); -- -- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log); -- if (m == NULL) { -- return NULL; -- } -- -- new = (ngx_pool_t *) m; -- -- new->d.end = m + psize; -- new->d.next = NULL; -- new->d.failed = 0; -- -- m += sizeof(ngx_pool_data_t); -- m = ngx_align_ptr(m, NGX_ALIGNMENT); -- new->d.last = m + size; -- -- for (p = pool->current; p->d.next; p = p->d.next) { -- if (p->d.failed++ > 4) { -- pool->current = p->d.next; -- } -- } -- -- p->d.next = new; -- -- return m; -+ return ngx_malloc(pool, size); - } - - - static void * --ngx_palloc_large(ngx_pool_t *pool, size_t size) -+ngx_malloc(ngx_pool_t *pool, size_t size) - { -- void *p; -- ngx_uint_t n; -- ngx_pool_large_t *large; -+ void *p; -+ ngx_pool_data_t *d; - - p = ngx_alloc(size, pool->log); - if (p == NULL) { - return NULL; - } - -- n = 0; -- -- for (large = pool->large; large; large = large->next) { -- if (large->alloc == NULL) { -- large->alloc = p; -- return p; -- } -- -- if (n++ > 3) { -- break; -- } -- } -- -- large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1); -- if (large == NULL) { -+ d = ngx_alloc(sizeof(ngx_pool_data_t), pool->log); -+ if (d == NULL){ - ngx_free(p); - return NULL; - } - -- large->alloc = p; -- large->next = pool->large; -- pool->large = large; -- -+ d->alloc = p; -+ d->next = pool->d; -+ pool->d = d; - return p; - } - -@@ -253,38 +156,48 @@ void * - ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment) - { - void *p; -- ngx_pool_large_t *large; -+ ngx_pool_data_t *d; - - p = ngx_memalign(alignment, size, pool->log); - if (p == NULL) { - return NULL; - } - -- large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1); -- if (large == NULL) { -+ d = ngx_alloc(sizeof(ngx_pool_data_t), pool->log); -+ if (d == NULL){ - ngx_free(p); - return NULL; - } - -- large->alloc = p; -- large->next = pool->large; -- pool->large = large; -- -+ d->alloc = p; -+ d->next = pool->d; -+ pool->d = d; - return p; - } - - - ngx_int_t --ngx_pfree(ngx_pool_t *pool, void *p) -+ngx_pfree(ngx_pool_t *pool, void *data) - { -- ngx_pool_large_t *l; -+ ngx_pool_data_t *p, *d; - -- for (l = pool->large; l; l = l->next) { -- if (p == l->alloc) { -- ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, -- "free: %p", l->alloc); -- ngx_free(l->alloc); -- l->alloc = NULL; -+ p = NULL; -+ for (d = pool->d; d; p = d, d = d->next) { -+ if (data == d->alloc) { -+ -+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc); -+ -+ ngx_free(d->alloc); -+ d->alloc = NULL; -+ -+ if (p) { -+ p->next = d->next; -+ -+ } else { -+ pool->d = d->next; -+ } -+ -+ ngx_free(d); - - return NGX_OK; - } -diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.13.2/src/core/ngx_palloc.h nginx-1.13.2-patched/src/core/ngx_palloc.h ---- nginx-1.13.2/src/core/ngx_palloc.h 2016-04-19 09:02:38.000000000 -0700 -+++ nginx-1.13.2-patched/src/core/ngx_palloc.h 2016-04-21 16:25:07.454949755 -0700 -@@ -38,28 +38,21 @@ struct ngx_pool_cleanup_s { - }; - - --typedef struct ngx_pool_large_s ngx_pool_large_t; -- --struct ngx_pool_large_s { -- ngx_pool_large_t *next; -- void *alloc; --}; -+typedef struct ngx_pool_data_s ngx_pool_large_t; -+typedef struct ngx_pool_data_s ngx_pool_data_t; - - --typedef struct { -- u_char *last; -- u_char *end; -- ngx_pool_t *next; -- ngx_uint_t failed; --} ngx_pool_data_t; -+struct ngx_pool_data_s { -+ ngx_pool_data_t *next; -+ void *alloc; -+}; - - - struct ngx_pool_s { -- ngx_pool_data_t d; -+ ngx_pool_data_t *d; - size_t max; - ngx_pool_t *current; - ngx_chain_t *chain; -- ngx_pool_large_t *large; - ngx_pool_cleanup_t *cleanup; - ngx_log_t *log; - }; diff --git a/patches/nginx-1.13.2-pcre_conf_opt.patch b/patches/nginx-1.13.2-pcre_conf_opt.patch deleted file mode 100644 index eb17e06..0000000 --- a/patches/nginx-1.13.2-pcre_conf_opt.patch +++ /dev/null @@ -1,26 +0,0 @@ -# HG changeset patch -# User Yichun Zhang -# Date 1386694955 28800 -# Node ID 9ba6b149669f1f02eeb4cdc0ebd364a949b5c469 -# Parent 30e806b8636af5fd3f03ec17df24801f390f7511 -Configure: added new option --with-pcre-conf-opt=OPTIONS. - -diff -r 30e806b8636a -r 9ba6b149669f auto/options ---- a/auto/options Mon Dec 09 10:16:44 2013 +0400 -+++ b/auto/options Tue Dec 10 09:02:35 2013 -0800 -@@ -286,6 +286,7 @@ - --with-pcre) USE_PCRE=YES ;; - --with-pcre=*) PCRE="$value" ;; - --with-pcre-opt=*) PCRE_OPT="$value" ;; -+ --with-pcre-conf-opt=*) PCRE_CONF_OPT="$value" ;; - --with-pcre-jit) PCRE_JIT=YES ;; - - --with-openssl=*) OPENSSL="$value" ;; -@@ -441,6 +442,7 @@ - --with-pcre force PCRE library usage - --with-pcre=DIR set path to PCRE library sources - --with-pcre-opt=OPTIONS set additional build options for PCRE -+ --with-pcre-conf-opt=OPTIONS set additional configure options for PCRE - --with-pcre-jit build PCRE with JIT compilation support - - --with-md5=DIR set path to md5 library sources diff --git a/patches/nginx-1.13.2-privileged_agent_process.patch b/patches/nginx-1.13.2-privileged_agent_process.patch deleted file mode 100644 index 1be5c34..0000000 --- a/patches/nginx-1.13.2-privileged_agent_process.patch +++ /dev/null @@ -1,211 +0,0 @@ -diff --git a/src/core/nginx.c b/src/core/nginx.c -index 60f8fe7..4bd244b 100644 ---- a/src/core/nginx.c -+++ b/src/core/nginx.c -@@ -981,6 +981,7 @@ ngx_core_module_create_conf(ngx_cycle_t *cycle) - - ccf->daemon = NGX_CONF_UNSET; - ccf->master = NGX_CONF_UNSET; -+ ccf->privileged_agent = NGX_CONF_UNSET; - ccf->timer_resolution = NGX_CONF_UNSET_MSEC; - - ccf->worker_processes = NGX_CONF_UNSET; -@@ -1009,6 +1010,7 @@ ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf) - - ngx_conf_init_value(ccf->daemon, 1); - ngx_conf_init_value(ccf->master, 1); -+ ngx_conf_init_value(ccf->privileged_agent, 0); - ngx_conf_init_msec_value(ccf->timer_resolution, 0); - - ngx_conf_init_value(ccf->worker_processes, 1); -diff --git a/src/core/ngx_cycle.h b/src/core/ngx_cycle.h -index c51b7ff..3261f90 100644 ---- a/src/core/ngx_cycle.h -+++ b/src/core/ngx_cycle.h -@@ -22,6 +22,9 @@ - #define NGX_DEBUG_POINTS_ABORT 2 - - -+#define HAVE_PRIVILEGED_PROCESS_PATCH 1 -+ -+ - typedef struct ngx_shm_zone_s ngx_shm_zone_t; - - typedef ngx_int_t (*ngx_shm_zone_init_pt) (ngx_shm_zone_t *zone, void *data); -@@ -81,6 +84,7 @@ struct ngx_cycle_s { - typedef struct { - ngx_flag_t daemon; - ngx_flag_t master; -+ ngx_flag_t privileged_agent; - - ngx_msec_t timer_resolution; - -diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c -index 7cee1c5..c4f70d6 100644 ---- a/src/os/unix/ngx_process_cycle.c -+++ b/src/os/unix/ngx_process_cycle.c -@@ -15,6 +15,8 @@ static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, - ngx_int_t type); - static void ngx_start_cache_manager_processes(ngx_cycle_t *cycle, - ngx_uint_t respawn); -+static void ngx_start_privileged_agent_processes(ngx_cycle_t *cycle, -+ ngx_uint_t respawn); - static void ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch); - static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo); - static ngx_uint_t ngx_reap_children(ngx_cycle_t *cycle); -@@ -24,6 +26,7 @@ static void ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker); - static void ngx_worker_process_exit(ngx_cycle_t *cycle); - static void ngx_channel_handler(ngx_event_t *ev); - static void ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data); -+static void ngx_privileged_agent_process_cycle(ngx_cycle_t *cycle, void *data); - static void ngx_cache_manager_process_handler(ngx_event_t *ev); - static void ngx_cache_loader_process_handler(ngx_event_t *ev); - -@@ -51,6 +54,8 @@ sig_atomic_t ngx_noaccept; - ngx_uint_t ngx_noaccepting; - ngx_uint_t ngx_restart; - -+ngx_uint_t ngx_is_privileged_agent; -+ - - static u_char master_process[] = "master process"; - -@@ -130,6 +135,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle) - ngx_start_worker_processes(cycle, ccf->worker_processes, - NGX_PROCESS_RESPAWN); - ngx_start_cache_manager_processes(cycle, 0); -+ ngx_start_privileged_agent_processes(cycle, 0); - - ngx_new_binary = 0; - delay = 0; -@@ -224,6 +230,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle) - ngx_start_worker_processes(cycle, ccf->worker_processes, - NGX_PROCESS_RESPAWN); - ngx_start_cache_manager_processes(cycle, 0); -+ ngx_start_privileged_agent_processes(cycle, 0); - ngx_noaccepting = 0; - - continue; -@@ -243,6 +250,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle) - ngx_start_worker_processes(cycle, ccf->worker_processes, - NGX_PROCESS_JUST_RESPAWN); - ngx_start_cache_manager_processes(cycle, 1); -+ ngx_start_privileged_agent_processes(cycle, 1); - - /* allow new processes to start */ - ngx_msleep(100); -@@ -257,6 +265,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle) - ngx_start_worker_processes(cycle, ccf->worker_processes, - NGX_PROCESS_RESPAWN); - ngx_start_cache_manager_processes(cycle, 0); -+ ngx_start_privileged_agent_processes(cycle, 0); - live = 1; - } - -@@ -424,6 +433,34 @@ ngx_start_cache_manager_processes(ngx_cycle_t *cycle, ngx_uint_t respawn) - - - static void -+ngx_start_privileged_agent_processes(ngx_cycle_t *cycle, ngx_uint_t respawn) -+{ -+ ngx_channel_t ch; -+ ngx_core_conf_t *ccf; -+ -+ ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, -+ ngx_core_module); -+ -+ if (!ccf->privileged_agent) { -+ return; -+ } -+ -+ ngx_spawn_process(cycle, ngx_privileged_agent_process_cycle, -+ "privileged agent process", "privileged agent process", -+ respawn ? NGX_PROCESS_JUST_RESPAWN : NGX_PROCESS_RESPAWN); -+ -+ ngx_memzero(&ch, sizeof(ngx_channel_t)); -+ -+ ch.command = NGX_CMD_OPEN_CHANNEL; -+ ch.pid = ngx_processes[ngx_process_slot].pid; -+ ch.slot = ngx_process_slot; -+ ch.fd = ngx_processes[ngx_process_slot].channel[0]; -+ -+ ngx_pass_open_channel(cycle, &ch); -+} -+ -+ -+static void - ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch) - { - ngx_int_t i; -@@ -827,7 +864,10 @@ ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker) - } - } - -- if (geteuid() == 0) { -+ /* -+ * privileged agent process has the same permission as master process -+ */ -+ if (!ngx_is_privileged_agent && geteuid() == 0) { - if (setgid(ccf->group) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "setgid(%d) failed", ccf->group); -@@ -1144,6 +1184,47 @@ ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data) - - - static void -+ngx_privileged_agent_process_cycle(ngx_cycle_t *cycle, void *data) -+{ -+ char *name = data; -+ -+ /* -+ * Set correct process type since closing listening Unix domain socket -+ * in a master process also removes the Unix domain socket file. -+ */ -+ ngx_process = NGX_PROCESS_HELPER; -+ ngx_is_privileged_agent = 1; -+ -+ ngx_close_listening_sockets(cycle); -+ -+ /* Set a moderate number of connections for a helper process. */ -+ cycle->connection_n = 512; -+ -+ ngx_worker_process_init(cycle, -1); -+ -+ ngx_use_accept_mutex = 0; -+ -+ ngx_setproctitle(name); -+ -+ for ( ;; ) { -+ -+ if (ngx_terminate || ngx_quit) { -+ ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); -+ ngx_worker_process_exit(cycle); -+ } -+ -+ if (ngx_reopen) { -+ ngx_reopen = 0; -+ ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); -+ ngx_reopen_files(cycle, -1); -+ } -+ -+ ngx_process_events_and_timers(cycle); -+ } -+} -+ -+ -+static void - ngx_cache_manager_process_handler(ngx_event_t *ev) - { - time_t next, n; -diff --git a/src/os/unix/ngx_process_cycle.h b/src/os/unix/ngx_process_cycle.h -index 69495d5..5149396 100644 ---- a/src/os/unix/ngx_process_cycle.h -+++ b/src/os/unix/ngx_process_cycle.h -@@ -45,6 +45,7 @@ extern ngx_pid_t ngx_new_binary; - extern ngx_uint_t ngx_inherited; - extern ngx_uint_t ngx_daemonized; - extern ngx_uint_t ngx_exiting; -+extern ngx_uint_t ngx_is_privileged_agent; - - extern sig_atomic_t ngx_reap; - extern sig_atomic_t ngx_sigio; diff --git a/patches/nginx-1.13.2-proxy_host_port_vars.patch b/patches/nginx-1.13.2-proxy_host_port_vars.patch deleted file mode 100644 index d766141..0000000 --- a/patches/nginx-1.13.2-proxy_host_port_vars.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- nginx-1.13.2/src/http/modules/ngx_http_proxy_module.c 2017-07-16 14:02:51.000000000 +0800 -+++ nginx-1.13.2-patched/src/http/modules/ngx_http_proxy_module.c 2017-07-16 14:02:51.000000000 +0800 -@@ -793,13 +793,13 @@ static ngx_keyval_t ngx_http_proxy_cach - static ngx_http_variable_t ngx_http_proxy_vars[] = { - - { ngx_string("proxy_host"), NULL, ngx_http_proxy_host_variable, 0, -- NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, -+ NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("proxy_port"), NULL, ngx_http_proxy_port_variable, 0, -- NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, -+ NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("proxy_add_x_forwarded_for"), NULL, -- ngx_http_proxy_add_x_forwarded_for_variable, 0, NGX_HTTP_VAR_NOHASH, 0 }, -+ ngx_http_proxy_add_x_forwarded_for_variable, 0, 0, 0 }, - - #if 0 - { ngx_string("proxy_add_via"), NULL, NULL, 0, NGX_HTTP_VAR_NOHASH, 0 }, diff --git a/patches/nginx-1.13.2-safe_resolver_ipv6_option.patch b/patches/nginx-1.13.2-safe_resolver_ipv6_option.patch deleted file mode 100644 index 96e3f05..0000000 --- a/patches/nginx-1.13.2-safe_resolver_ipv6_option.patch +++ /dev/null @@ -1,55 +0,0 @@ -# HG changeset patch -# User Thibault Charbonnier -# Date 1481847421 28800 -# Thu Dec 15 16:17:01 2016 -0800 -# Node ID 8bf038fe006fd8ae253d6b41fc6cf109a8912d3e -# Parent a3dc657f4e9530623683e6b85bd7492662e4dc47 -Resolver: ignore ipv6=off resolver option when no ipv6 support - -Makes the resolver directive more robust: we only error out when ipv6 -resolution is desired but not supported (ipv6=on). - -use case 1: some configurations are sometimes re-used between builds with and -without ipv6 support. This patch avoids the need to remove the "ipv6=off" flag. - -use case 2: currently, some tools rely on the --with-ipv6 configure option from -"nginx -V" to determine if ipv6 resolution should be disabled in some cases. -With this option disappearing in Nginx 1.11.5, this patch would allow such tools -to assume "ipv6=off" to be safe regardless of ipv6 support in the current -build. - -diff -r a3dc657f4e95 -r 8bf038fe006f src/core/ngx_resolver.c ---- a/src/core/ngx_resolver.c Thu Dec 15 21:44:34 2016 +0300 -+++ b/src/core/ngx_resolver.c Thu Dec 15 16:17:01 2016 -0800 -@@ -224,14 +224,22 @@ - continue; - } - --#if (NGX_HAVE_INET6) - if (ngx_strncmp(names[i].data, "ipv6=", 5) == 0) { - - if (ngx_strcmp(&names[i].data[5], "on") == 0) { -+#if (NGX_HAVE_INET6) - r->ipv6 = 1; -+#else -+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, -+ "no ipv6 support but \"%V\" in resolver", -+ &names[i]); -+ return NULL; -+#endif - - } else if (ngx_strcmp(&names[i].data[5], "off") == 0) { -+#if (NGX_HAVE_INET6) - r->ipv6 = 0; -+#endif - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, -@@ -241,7 +249,6 @@ - - continue; - } --#endif - - ngx_memzero(&u, sizeof(ngx_url_t)); - diff --git a/patches/nginx-1.13.2-server_header.patch b/patches/nginx-1.13.2-server_header.patch deleted file mode 100644 index 5672768..0000000 --- a/patches/nginx-1.13.2-server_header.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/src/core/nginx.h b/src/core/nginx.h -index 37e257fc..fd49eff7 100644 ---- a/src/core/nginx.h -+++ b/src/core/nginx.h -@@ -11,7 +11,7 @@ - - #define nginx_version 1013002 - #define NGINX_VERSION "1.13.2" --#define NGINX_VER "nginx/" NGINX_VERSION -+#define NGINX_VER "openresty/" NGINX_VERSION ".unknown" - - #ifdef NGX_BUILD - #define NGINX_VER_BUILD NGINX_VER " (" NGX_BUILD ")" -diff --git a/src/http/ngx_http_header_filter_module.c b/src/http/ngx_http_header_filter_module.c -index 9b894059..ca13f2a3 100644 ---- a/src/http/ngx_http_header_filter_module.c -+++ b/src/http/ngx_http_header_filter_module.c -@@ -46,7 +46,7 @@ ngx_module_t ngx_http_header_filter_module = { - }; - - --static u_char ngx_http_server_string[] = "Server: nginx" CRLF; -+static u_char ngx_http_server_string[] = "Server: openresty" CRLF; - static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF; - static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF; - diff --git a/patches/nginx-1.13.2-setting_args_invalidates_uri.patch b/patches/nginx-1.13.2-setting_args_invalidates_uri.patch deleted file mode 100644 index c2fcd4c..0000000 --- a/patches/nginx-1.13.2-setting_args_invalidates_uri.patch +++ /dev/null @@ -1,44 +0,0 @@ -# HG changeset patch -# User Yichun Zhang -# Date 1390506359 28800 -# Node ID 17186b98c235c07e94c64e5853689f790f173756 -# Parent 4b50d1f299d8a69f3e3f7975132e1490352642fe -Variable: setting $args should invalidate unparsed uri. - -diff -r 4b50d1f299d8 -r 17186b98c235 src/http/ngx_http_variables.c ---- a/src/http/ngx_http_variables.c Fri Jan 10 11:22:14 2014 -0800 -+++ b/src/http/ngx_http_variables.c Thu Jan 23 11:45:59 2014 -0800 -@@ -15,6 +15,8 @@ - ngx_http_variable_value_t *v, uintptr_t data); - static void ngx_http_variable_request_set(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -+static void ngx_http_variable_request_args_set(ngx_http_request_t *r, -+ ngx_http_variable_value_t *v, uintptr_t data); - static ngx_int_t ngx_http_variable_request_get_size(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - static void ngx_http_variable_request_set_size(ngx_http_request_t *r, -@@ -218,7 +220,7 @@ - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("args"), -- ngx_http_variable_request_set, -+ ngx_http_variable_request_args_set, - ngx_http_variable_request, - offsetof(ngx_http_request_t, args), - NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, -@@ -647,6 +649,15 @@ - - - static void -+ngx_http_variable_request_args_set(ngx_http_request_t *r, -+ ngx_http_variable_value_t *v, uintptr_t data) -+{ -+ r->valid_unparsed_uri = 0; -+ ngx_http_variable_request_set(r, v, data); -+} -+ -+ -+static void - ngx_http_variable_request_set(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) - { diff --git a/patches/nginx-1.13.2-single_process_graceful_exit.patch b/patches/nginx-1.13.2-single_process_graceful_exit.patch deleted file mode 100644 index 095e7ff..0000000 --- a/patches/nginx-1.13.2-single_process_graceful_exit.patch +++ /dev/null @@ -1,53 +0,0 @@ -diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c -index 1710ea81..b379da9c 100644 ---- a/src/os/unix/ngx_process_cycle.c -+++ b/src/os/unix/ngx_process_cycle.c -@@ -304,11 +304,26 @@ ngx_single_process_cycle(ngx_cycle_t *cycle) - } - - for ( ;; ) { -+ if (ngx_exiting) { -+ if (ngx_event_no_timers_left() == NGX_OK) { -+ ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); -+ -+ for (i = 0; cycle->modules[i]; i++) { -+ if (cycle->modules[i]->exit_process) { -+ cycle->modules[i]->exit_process(cycle); -+ } -+ } -+ -+ ngx_master_process_exit(cycle); -+ } -+ } -+ - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle"); - - ngx_process_events_and_timers(cycle); - -- if (ngx_terminate || ngx_quit) { -+ if (ngx_terminate) { -+ ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->exit_process) { -@@ -319,6 +334,20 @@ ngx_single_process_cycle(ngx_cycle_t *cycle) - ngx_master_process_exit(cycle); - } - -+ if (ngx_quit) { -+ ngx_quit = 0; -+ ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, -+ "gracefully shutting down"); -+ ngx_setproctitle("process is shutting down"); -+ -+ if (!ngx_exiting) { -+ ngx_exiting = 1; -+ ngx_set_shutdown_timer(cycle); -+ ngx_close_listening_sockets(cycle); -+ ngx_close_idle_connections(cycle); -+ } -+ } -+ - if (ngx_reconfigure) { - ngx_reconfigure = 0; - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring"); diff --git a/patches/nginx-1.13.2-slab_defrag.patch b/patches/nginx-1.13.2-slab_defrag.patch deleted file mode 100644 index 0ef367e..0000000 --- a/patches/nginx-1.13.2-slab_defrag.patch +++ /dev/null @@ -1,138 +0,0 @@ -diff --git a/src/core/ngx_slab.c b/src/core/ngx_slab.c -index c3a27f7..1bde432 100644 ---- a/src/core/ngx_slab.c -+++ b/src/core/ngx_slab.c -@@ -6,6 +6,7 @@ - - #include - #include -+#include - - - #define NGX_SLAB_PAGE_MASK 3 -@@ -111,6 +112,7 @@ ngx_slab_init(ngx_slab_pool_t *pool) - ngx_memzero(p, pages * sizeof(ngx_slab_page_t)); - - pool->pages = (ngx_slab_page_t *) p; -+ pool->npages = pages; - - pool->free.prev = 0; - pool->free.next = (ngx_slab_page_t *) p; -@@ -118,6 +120,7 @@ ngx_slab_init(ngx_slab_pool_t *pool) - pool->pages->slab = pages; - pool->pages->next = &pool->free; - pool->pages->prev = (uintptr_t) &pool->free; -+ pool->pages->prev_slab = 0; - - pool->start = (u_char *) - ngx_align_ptr((uintptr_t) p + pages * sizeof(ngx_slab_page_t), -@@ -625,9 +628,16 @@ ngx_slab_alloc_pages(ngx_slab_pool_t *pool, ngx_uint_t pages) - if (page->slab >= pages) { - - if (page->slab > pages) { -+ /* adjust the next adjacent block's "prev_slab" field */ -+ p = &page[page->slab]; -+ if (p < pool->pages + pool->npages) { -+ p->prev_slab = page->slab - pages; -+ } -+ - page[pages].slab = page->slab - pages; - page[pages].next = page->next; - page[pages].prev = page->prev; -+ page[pages].prev_slab = pages; - - p = (ngx_slab_page_t *) page->prev; - p->next = &page[pages]; -@@ -651,6 +661,7 @@ ngx_slab_alloc_pages(ngx_slab_pool_t *pool, ngx_uint_t pages) - p->slab = NGX_SLAB_PAGE_BUSY; - p->next = NULL; - p->prev = NGX_SLAB_PAGE; -+ p->prev_slab = 0; - p++; - } - -@@ -668,7 +679,7 @@ static void - ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page, - ngx_uint_t pages) - { -- ngx_slab_page_t *prev; -+ ngx_slab_page_t *prev, *p; - - page->slab = pages--; - -@@ -682,6 +693,53 @@ ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page, - page->next->prev = page->prev; - } - -+ /* merge the next adjacent free block if it is free */ -+ -+ p = &page[page->slab]; -+ if (p < pool->pages + pool->npages -+ && !(p->slab & NGX_SLAB_PAGE_START) -+ && p->next != NULL -+ && (p->prev & NGX_SLAB_PAGE_MASK) == NGX_SLAB_PAGE) -+ { -+ page->slab += p->slab; -+ -+ /* remove the next adjacent block from the free list */ -+ -+ prev = (ngx_slab_page_t *) p->prev; -+ prev->next = p->next; -+ p->next->prev = p->prev; -+ -+ /* adjust the "prev_slab" field in the next next adjacent block */ -+ if (p + p->slab < pool->pages + pool->npages) { -+ p[p->slab].prev_slab = page->slab; -+ } -+ -+ ngx_memzero(p, sizeof(ngx_slab_page_t)); -+ } -+ -+ if (page->prev_slab) { -+ /* merge the previous adjacent block if it is free */ -+ -+ p = page - page->prev_slab; -+ if (!(p->slab & NGX_SLAB_PAGE_START) -+ && p->next != NULL -+ && (p->prev & NGX_SLAB_PAGE_MASK) == NGX_SLAB_PAGE) -+ { -+ assert(p->slab == page->prev_slab); -+ -+ p->slab += page->slab; -+ ngx_memzero(page, sizeof(ngx_slab_page_t)); -+ -+ /* adjust the "prev_slab" field in the next adjacent block */ -+ if (p + p->slab < pool->pages + pool->npages) { -+ p[p->slab].prev_slab = p->slab; -+ } -+ -+ /* skip adding "page" to the free list */ -+ return; -+ } -+ } -+ - page->prev = (uintptr_t) &pool->free; - page->next = pool->free.next; - -diff --git a/src/core/ngx_slab.h b/src/core/ngx_slab.h -index c5e420b..287ac79 100644 ---- a/src/core/ngx_slab.h -+++ b/src/core/ngx_slab.h -@@ -19,6 +19,8 @@ struct ngx_slab_page_s { - uintptr_t slab; - ngx_slab_page_t *next; - uintptr_t prev; -+ uintptr_t prev_slab; -+ /* number of pages for the previous adjacent block */ - }; - - -@@ -31,6 +33,8 @@ typedef struct { - ngx_slab_page_t *pages; - ngx_slab_page_t free; - -+ ngx_uint_t npages; -+ - u_char *start; - u_char *end; - diff --git a/patches/nginx-1.13.2-ssl_cert_cb_yield.patch b/patches/nginx-1.13.2-ssl_cert_cb_yield.patch deleted file mode 100644 index e394039..0000000 --- a/patches/nginx-1.13.2-ssl_cert_cb_yield.patch +++ /dev/null @@ -1,42 +0,0 @@ -# HG changeset patch -# User Yichun Zhang -# Date 1451762084 28800 -# Sat Jan 02 11:14:44 2016 -0800 -# Node ID 449f0461859c16e95bdb18e8be6b94401545d3dd -# Parent 78b4e10b4367b31367aad3c83c9c3acdd42397c4 -SSL: handled SSL_CTX_set_cert_cb() callback yielding. - -OpenSSL 1.0.2+ introduces SSL_CTX_set_cert_cb() to allow custom -callbacks to serve the SSL certificiates and private keys dynamically -and lazily. The callbacks may yield for nonblocking I/O or sleeping. -Here we added support for such usage in NGINX 3rd-party modules -(like ngx_lua) in NGINX's event handlers for downstream SSL -connections. - -diff -r 78b4e10b4367 -r 449f0461859c src/event/ngx_event_openssl.c ---- a/src/event/ngx_event_openssl.c Thu Dec 17 16:39:15 2015 +0300 -+++ b/src/event/ngx_event_openssl.c Sat Jan 02 11:14:44 2016 -0800 -@@ -1210,6 +1210,23 @@ - return NGX_AGAIN; - } - -+#if OPENSSL_VERSION_NUMBER >= 0x10002000L -+ if (sslerr == SSL_ERROR_WANT_X509_LOOKUP) { -+ c->read->handler = ngx_ssl_handshake_handler; -+ c->write->handler = ngx_ssl_handshake_handler; -+ -+ if (ngx_handle_read_event(c->read, 0) != NGX_OK) { -+ return NGX_ERROR; -+ } -+ -+ if (ngx_handle_write_event(c->write, 0) != NGX_OK) { -+ return NGX_ERROR; -+ } -+ -+ return NGX_AGAIN; -+ } -+#endif -+ - err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; - - c->ssl->no_wait_shutdown = 1; diff --git a/patches/nginx-1.13.2-ssl_pending_session.patch b/patches/nginx-1.13.2-ssl_pending_session.patch deleted file mode 100644 index cf3db93..0000000 --- a/patches/nginx-1.13.2-ssl_pending_session.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- nginx-1.13.2/src/event/ngx_event_openssl.c 2016-07-17 19:20:30.411137606 -0700 -+++ nginx-1.13.2-patched/src/event/ngx_event_openssl.c 2016-07-19 16:53:35.539768477 -0700 -@@ -1307,7 +1307,12 @@ ngx_ssl_handshake(ngx_connection_t *c) - } - - #if OPENSSL_VERSION_NUMBER >= 0x10002000L -- if (sslerr == SSL_ERROR_WANT_X509_LOOKUP) { -+ if (sslerr == SSL_ERROR_WANT_X509_LOOKUP -+# ifdef SSL_ERROR_PENDING_SESSION -+ || sslerr == SSL_ERROR_PENDING_SESSION -+# endif -+ ) -+ { - c->read->handler = ngx_ssl_handshake_handler; - c->write->handler = ngx_ssl_handshake_handler; - diff --git a/patches/nginx-1.13.2-upstream_pipelining.patch b/patches/nginx-1.13.2-upstream_pipelining.patch deleted file mode 100644 index 426cce9..0000000 --- a/patches/nginx-1.13.2-upstream_pipelining.patch +++ /dev/null @@ -1,23 +0,0 @@ -commit f9907b72a76a21ac5413187b83177a919475c75f -Author: Yichun Zhang (agentzh) -Date: Wed Feb 10 16:05:08 2016 -0800 - - bugfix: upstream: keep sending request data after the first write attempt. - - See - http://mailman.nginx.org/pipermail/nginx-devel/2012-March/002040.html - for more details on the issue. - -diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c -index dbaa956..a25aaa2 100644 ---- a/src/http/ngx_http_upstream.c -+++ b/src/http/ngx_http_upstream.c -@@ -2003,7 +2003,7 @@ ngx_http_upstream_send_request_handler(ngx_http_request_t *r, - - #endif - -- if (u->header_sent) { -+ if (u->request_body_sent) { - u->write_event_handler = ngx_http_upstream_dummy_handler; - - (void) ngx_handle_write_event(c->write, 0); diff --git a/patches/nginx-1.13.2-upstream_timeout_fields.patch b/patches/nginx-1.13.2-upstream_timeout_fields.patch deleted file mode 100644 index a6f7f10..0000000 --- a/patches/nginx-1.13.2-upstream_timeout_fields.patch +++ /dev/null @@ -1,121 +0,0 @@ -diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c -index c394b291..e10df0ab 100644 ---- a/src/http/ngx_http_upstream.c -+++ b/src/http/ngx_http_upstream.c -@@ -502,12 +502,19 @@ void - ngx_http_upstream_init(ngx_http_request_t *r) - { - ngx_connection_t *c; -+ ngx_http_upstream_t *u; - - c = r->connection; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http init upstream, client timer: %d", c->read->timer_set); - -+ u = r->upstream; -+ -+ u->connect_timeout = u->conf->connect_timeout; -+ u->send_timeout = u->conf->send_timeout; -+ u->read_timeout = u->conf->read_timeout; -+ - #if (NGX_HTTP_V2) - if (r->stream) { - ngx_http_upstream_init_request(r); -@@ -1590,7 +1597,7 @@ ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u) - u->request_body_sent = 0; - - if (rc == NGX_AGAIN) { -- ngx_add_timer(c->write, u->conf->connect_timeout); -+ ngx_add_timer(c->write, u->connect_timeout); - return; - } - -@@ -1666,7 +1673,7 @@ ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r, - if (rc == NGX_AGAIN) { - - if (!c->write->timer_set) { -- ngx_add_timer(c->write, u->conf->connect_timeout); -+ ngx_add_timer(c->write, u->connect_timeout); - } - - c->ssl->handler = ngx_http_upstream_ssl_handshake_handler; -@@ -1960,7 +1967,7 @@ ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u, - - if (rc == NGX_AGAIN) { - if (!c->write->ready) { -- ngx_add_timer(c->write, u->conf->send_timeout); -+ ngx_add_timer(c->write, u->send_timeout); - - } else if (c->write->timer_set) { - ngx_del_timer(c->write); -@@ -2003,7 +2010,7 @@ ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u, - return; - } - -- ngx_add_timer(c->read, u->conf->read_timeout); -+ ngx_add_timer(c->read, u->read_timeout); - - if (c->read->ready) { - ngx_http_upstream_process_header(r, u); -@@ -2800,7 +2807,7 @@ ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r, - } - - if (rev->active) { -- ngx_add_timer(rev, u->conf->read_timeout); -+ ngx_add_timer(rev, u->read_timeout); - - } else if (rev->timer_set) { - ngx_del_timer(rev); -@@ -3129,7 +3136,7 @@ ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u) - p->cyclic_temp_file = 0; - } - -- p->read_timeout = u->conf->read_timeout; -+ p->read_timeout = u->read_timeout; - p->send_timeout = clcf->send_timeout; - p->send_lowat = clcf->send_lowat; - -@@ -3367,7 +3374,7 @@ ngx_http_upstream_process_upgraded(ngx_http_request_t *r, - } - - if (upstream->write->active && !upstream->write->ready) { -- ngx_add_timer(upstream->write, u->conf->send_timeout); -+ ngx_add_timer(upstream->write, u->send_timeout); - - } else if (upstream->write->timer_set) { - ngx_del_timer(upstream->write); -@@ -3379,7 +3386,7 @@ ngx_http_upstream_process_upgraded(ngx_http_request_t *r, - } - - if (upstream->read->active && !upstream->read->ready) { -- ngx_add_timer(upstream->read, u->conf->read_timeout); -+ ngx_add_timer(upstream->read, u->read_timeout); - - } else if (upstream->read->timer_set) { - ngx_del_timer(upstream->read); -@@ -3573,7 +3580,7 @@ ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r, - } - - if (upstream->read->active && !upstream->read->ready) { -- ngx_add_timer(upstream->read, u->conf->read_timeout); -+ ngx_add_timer(upstream->read, u->read_timeout); - - } else if (upstream->read->timer_set) { - ngx_del_timer(upstream->read); -diff --git a/src/http/ngx_http_upstream.h b/src/http/ngx_http_upstream.h -index c552ac0c..40b69d0a 100644 ---- a/src/http/ngx_http_upstream.h -+++ b/src/http/ngx_http_upstream.h -@@ -329,6 +329,11 @@ struct ngx_http_upstream_s { - ngx_array_t *caches; - #endif - -+#define HAVE_NGX_UPSTREAM_TIMEOUT_FIELDS 1 -+ ngx_msec_t connect_timeout; -+ ngx_msec_t send_timeout; -+ ngx_msec_t read_timeout; -+ - ngx_http_upstream_headers_in_t headers_in; - - ngx_http_upstream_resolved_t *resolved;