Backed out changeset 2f66fa8f7a04
diff --git a/alpine/Makefile.module-njs b/alpine/Makefile.module-njs
index 2ae0c01..466f67d 100644
--- a/alpine/Makefile.module-njs
+++ b/alpine/Makefile.module-njs
@@ -11,7 +11,6 @@
MODULE_VERSION_PREFIX_njs=$(MODULE_TARGET_PREFIX)
MODULE_BUILD_DEPENDS_njs=libedit-dev
-MODULE_PATCHES_njs=extra-patch-1568-fix-subrequest-error-page
define MODULE_ADD_CONTROL_TAGS_njs
replaces="nginx-mod-http-js"
diff --git a/alpine/src/extra-patch-1568-fix-subrequest-error-page b/alpine/src/extra-patch-1568-fix-subrequest-error-page
deleted file mode 100644
index a56bdf1..0000000
--- a/alpine/src/extra-patch-1568-fix-subrequest-error-page
+++ /dev/null
@@ -1,151 +0,0 @@
-# HG changeset patch
-# User Dmitry Volyntsev <xeioex@nginx.com>
-# Date 1605722951 0
-# Wed Nov 18 18:09:11 2020 +0000
-# Node ID c947a300b96c87c1d77cbb1a1fbc149ea8c6a1d0
-# Parent e97f76121196bda29a450388f82458f575665d88
-HTTP: fixed promise subrequest() with error_page redirect.
-
-Previously, promise callbacks for a subrequest were stored in a
-subrequest context. This is incorrect because a subrequest content may
-be destroyed (for example when error_page with redirect is enabled for a
-subrequest location).
-
-The fix is to store callbacks in the parent context.
-
-The issue was introduced in 6fccbc9f1288 (0.3.8).
-
-diff -r e97f76121196 -r c947a300b96c nginx/ngx_http_js_module.c
---- a/njs-0.4.4/nginx/ngx_http_js_module.c Tue Nov 17 13:22:34 2020 +0000
-+++ b/njs-0.4.4/nginx/ngx_http_js_module.c Wed Nov 18 18:09:11 2020 +0000
-@@ -44,12 +44,18 @@ typedef struct {
- njs_opaque_value_t request;
- njs_opaque_value_t request_body;
- ngx_str_t redirect_uri;
-- njs_opaque_value_t promise_callbacks[2];
-+ ngx_array_t promise_callbacks;
- } ngx_http_js_ctx_t;
-
-
- typedef struct {
- ngx_http_request_t *request;
-+ njs_opaque_value_t callbacks[2];
-+} ngx_http_js_cb_t;
-+
-+
-+typedef struct {
-+ ngx_http_request_t *request;
- njs_vm_event_t vm_event;
- void *unused;
- ngx_int_t ident;
-@@ -2276,19 +2282,52 @@ static njs_int_t
- ngx_http_js_promise_trampoline(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
- {
-+ ngx_uint_t i;
- njs_function_t *callback;
-+ ngx_http_js_cb_t *cb, *cbs;
- ngx_http_js_ctx_t *ctx;
- ngx_http_request_t *r;
-
- r = njs_vm_external(vm, njs_argument(args, 1));
-- ctx = ngx_http_get_module_ctx(r, ngx_http_js_module);
-+ ctx = ngx_http_get_module_ctx(r->parent, ngx_http_js_module);
-
- ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-- "js subrequest promise trampoline ctx: %p", ctx);
--
-- callback = njs_value_function(njs_value_arg(&ctx->promise_callbacks[0]));
-+ "js subrequest promise trampoline parent ctx: %p", ctx);
-+
-+ if (ctx == NULL) {
-+ njs_vm_error(vm, "js subrequest: failed to get the parent context");
-+ return NJS_ERROR;
-+ }
-+
-+ cbs = ctx->promise_callbacks.elts;
-+
-+ if (cbs == NULL) {
-+ goto fail;
-+ }
-+
-+ cb = NULL;
-+
-+ for (i = 0; i < ctx->promise_callbacks.nelts; i++) {
-+ if (cbs[i].request == r) {
-+ cb = &cbs[i];
-+ cb->request = NULL;
-+ break;
-+ }
-+ }
-+
-+ if (cb == NULL) {
-+ goto fail;
-+ }
-+
-+ callback = njs_value_function(njs_value_arg(&cb->callbacks[0]));
-
- return njs_vm_call(vm, callback, njs_argument(args, 1), 1);
-+
-+fail:
-+
-+ njs_vm_error(vm, "js subrequest: promise callback not found");
-+
-+ return NJS_ERROR;
- }
-
-
-@@ -2298,9 +2337,10 @@ ngx_http_js_ext_subrequest(njs_vm_t *vm,
- {
- ngx_int_t rc, promise;
- njs_str_t uri_arg, args_arg, method_name, body_arg;
-- ngx_uint_t method, methods_max, has_body, detached;
-+ ngx_uint_t i, method, methods_max, has_body, detached;
- njs_value_t *value, *arg, *options;
- njs_function_t *callback;
-+ ngx_http_js_cb_t *cb, *cbs;
- ngx_http_js_ctx_t *ctx;
- njs_opaque_value_t lvalue;
- ngx_http_request_t *r, *sr;
-@@ -2507,15 +2547,36 @@ ngx_http_js_ext_subrequest(njs_vm_t *vm,
- }
-
- if (promise) {
-- ctx = ngx_pcalloc(sr->pool, sizeof(ngx_http_js_ctx_t));
-- if (ctx == NULL) {
-- return NGX_ERROR;
-+ cbs = ctx->promise_callbacks.elts;
-+
-+ if (cbs == NULL) {
-+ if (ngx_array_init(&ctx->promise_callbacks, r->pool, 4,
-+ sizeof(ngx_http_js_cb_t)) != NGX_OK)
-+ {
-+ goto memory_error;
-+ }
- }
-
-- ngx_http_set_ctx(sr, ctx, ngx_http_js_module);
-+ cb = NULL;
-+
-+ for (i = 0; i < ctx->promise_callbacks.nelts; i++) {
-+ if (cbs[i].request == NULL) {
-+ cb = &cbs[i];
-+ break;
-+ }
-+ }
-+
-+ if (i == ctx->promise_callbacks.nelts) {
-+ cb = ngx_array_push(&ctx->promise_callbacks);
-+ if (cb == NULL) {
-+ goto memory_error;
-+ }
-+ }
-+
-+ cb->request = sr;
-
- return njs_vm_promise_create(vm, njs_vm_retval(vm),
-- njs_value_arg(&ctx->promise_callbacks));
-+ njs_value_arg(&cb->callbacks));
- }
-
- njs_value_undefined_set(njs_vm_retval(vm));
diff --git a/debian/Makefile.module-njs b/debian/Makefile.module-njs
index 492e394..b477557 100644
--- a/debian/Makefile.module-njs
+++ b/debian/Makefile.module-njs
@@ -5,7 +5,6 @@
MODULE_VERSION_njs= 0.4.4
MODULE_RELEASE_njs= 1
-MODULE_PATCHES_njs= 1568-fix-subrequest-error-page.patch
MODULE_SOURCES_njs= njs-$(MODULE_VERSION_njs).tar.gz
MODULE_CONFARGS_njs= --add-dynamic-module=$(MODSRC_PREFIX)njs-$(MODULE_VERSION_njs)/nginx
diff --git a/debian/extra/1568-fix-subrequest-error-page.patch b/debian/extra/1568-fix-subrequest-error-page.patch
deleted file mode 100644
index b756910..0000000
--- a/debian/extra/1568-fix-subrequest-error-page.patch
+++ /dev/null
@@ -1,151 +0,0 @@
-# HG changeset patch
-# User Dmitry Volyntsev <xeioex@nginx.com>
-# Date 1605722951 0
-# Wed Nov 18 18:09:11 2020 +0000
-# Node ID c947a300b96c87c1d77cbb1a1fbc149ea8c6a1d0
-# Parent e97f76121196bda29a450388f82458f575665d88
-HTTP: fixed promise subrequest() with error_page redirect.
-
-Previously, promise callbacks for a subrequest were stored in a
-subrequest context. This is incorrect because a subrequest content may
-be destroyed (for example when error_page with redirect is enabled for a
-subrequest location).
-
-The fix is to store callbacks in the parent context.
-
-The issue was introduced in 6fccbc9f1288 (0.3.8).
-
-diff -r e97f76121196 -r c947a300b96c nginx/ngx_http_js_module.c
---- c/njs-0.4.4/nginx/ngx_http_js_module.c Tue Nov 17 13:22:34 2020 +0000
-+++ d/njs-0.4.4/nginx/ngx_http_js_module.c Wed Nov 18 18:09:11 2020 +0000
-@@ -44,12 +44,18 @@ typedef struct {
- njs_opaque_value_t request;
- njs_opaque_value_t request_body;
- ngx_str_t redirect_uri;
-- njs_opaque_value_t promise_callbacks[2];
-+ ngx_array_t promise_callbacks;
- } ngx_http_js_ctx_t;
-
-
- typedef struct {
- ngx_http_request_t *request;
-+ njs_opaque_value_t callbacks[2];
-+} ngx_http_js_cb_t;
-+
-+
-+typedef struct {
-+ ngx_http_request_t *request;
- njs_vm_event_t vm_event;
- void *unused;
- ngx_int_t ident;
-@@ -2276,19 +2282,52 @@ static njs_int_t
- ngx_http_js_promise_trampoline(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
- {
-+ ngx_uint_t i;
- njs_function_t *callback;
-+ ngx_http_js_cb_t *cb, *cbs;
- ngx_http_js_ctx_t *ctx;
- ngx_http_request_t *r;
-
- r = njs_vm_external(vm, njs_argument(args, 1));
-- ctx = ngx_http_get_module_ctx(r, ngx_http_js_module);
-+ ctx = ngx_http_get_module_ctx(r->parent, ngx_http_js_module);
-
- ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-- "js subrequest promise trampoline ctx: %p", ctx);
--
-- callback = njs_value_function(njs_value_arg(&ctx->promise_callbacks[0]));
-+ "js subrequest promise trampoline parent ctx: %p", ctx);
-+
-+ if (ctx == NULL) {
-+ njs_vm_error(vm, "js subrequest: failed to get the parent context");
-+ return NJS_ERROR;
-+ }
-+
-+ cbs = ctx->promise_callbacks.elts;
-+
-+ if (cbs == NULL) {
-+ goto fail;
-+ }
-+
-+ cb = NULL;
-+
-+ for (i = 0; i < ctx->promise_callbacks.nelts; i++) {
-+ if (cbs[i].request == r) {
-+ cb = &cbs[i];
-+ cb->request = NULL;
-+ break;
-+ }
-+ }
-+
-+ if (cb == NULL) {
-+ goto fail;
-+ }
-+
-+ callback = njs_value_function(njs_value_arg(&cb->callbacks[0]));
-
- return njs_vm_call(vm, callback, njs_argument(args, 1), 1);
-+
-+fail:
-+
-+ njs_vm_error(vm, "js subrequest: promise callback not found");
-+
-+ return NJS_ERROR;
- }
-
-
-@@ -2298,9 +2337,10 @@ ngx_http_js_ext_subrequest(njs_vm_t *vm,
- {
- ngx_int_t rc, promise;
- njs_str_t uri_arg, args_arg, method_name, body_arg;
-- ngx_uint_t method, methods_max, has_body, detached;
-+ ngx_uint_t i, method, methods_max, has_body, detached;
- njs_value_t *value, *arg, *options;
- njs_function_t *callback;
-+ ngx_http_js_cb_t *cb, *cbs;
- ngx_http_js_ctx_t *ctx;
- njs_opaque_value_t lvalue;
- ngx_http_request_t *r, *sr;
-@@ -2507,15 +2547,36 @@ ngx_http_js_ext_subrequest(njs_vm_t *vm,
- }
-
- if (promise) {
-- ctx = ngx_pcalloc(sr->pool, sizeof(ngx_http_js_ctx_t));
-- if (ctx == NULL) {
-- return NGX_ERROR;
-+ cbs = ctx->promise_callbacks.elts;
-+
-+ if (cbs == NULL) {
-+ if (ngx_array_init(&ctx->promise_callbacks, r->pool, 4,
-+ sizeof(ngx_http_js_cb_t)) != NGX_OK)
-+ {
-+ goto memory_error;
-+ }
- }
-
-- ngx_http_set_ctx(sr, ctx, ngx_http_js_module);
-+ cb = NULL;
-+
-+ for (i = 0; i < ctx->promise_callbacks.nelts; i++) {
-+ if (cbs[i].request == NULL) {
-+ cb = &cbs[i];
-+ break;
-+ }
-+ }
-+
-+ if (i == ctx->promise_callbacks.nelts) {
-+ cb = ngx_array_push(&ctx->promise_callbacks);
-+ if (cb == NULL) {
-+ goto memory_error;
-+ }
-+ }
-+
-+ cb->request = sr;
-
- return njs_vm_promise_create(vm, njs_vm_retval(vm),
-- njs_value_arg(&ctx->promise_callbacks));
-+ njs_value_arg(&cb->callbacks));
- }
-
- njs_value_undefined_set(njs_vm_retval(vm));
diff --git a/rpm/SOURCES/1568-fix-subrequest-error-page.patch b/rpm/SOURCES/1568-fix-subrequest-error-page.patch
deleted file mode 100644
index a56bdf1..0000000
--- a/rpm/SOURCES/1568-fix-subrequest-error-page.patch
+++ /dev/null
@@ -1,151 +0,0 @@
-# HG changeset patch
-# User Dmitry Volyntsev <xeioex@nginx.com>
-# Date 1605722951 0
-# Wed Nov 18 18:09:11 2020 +0000
-# Node ID c947a300b96c87c1d77cbb1a1fbc149ea8c6a1d0
-# Parent e97f76121196bda29a450388f82458f575665d88
-HTTP: fixed promise subrequest() with error_page redirect.
-
-Previously, promise callbacks for a subrequest were stored in a
-subrequest context. This is incorrect because a subrequest content may
-be destroyed (for example when error_page with redirect is enabled for a
-subrequest location).
-
-The fix is to store callbacks in the parent context.
-
-The issue was introduced in 6fccbc9f1288 (0.3.8).
-
-diff -r e97f76121196 -r c947a300b96c nginx/ngx_http_js_module.c
---- a/njs-0.4.4/nginx/ngx_http_js_module.c Tue Nov 17 13:22:34 2020 +0000
-+++ b/njs-0.4.4/nginx/ngx_http_js_module.c Wed Nov 18 18:09:11 2020 +0000
-@@ -44,12 +44,18 @@ typedef struct {
- njs_opaque_value_t request;
- njs_opaque_value_t request_body;
- ngx_str_t redirect_uri;
-- njs_opaque_value_t promise_callbacks[2];
-+ ngx_array_t promise_callbacks;
- } ngx_http_js_ctx_t;
-
-
- typedef struct {
- ngx_http_request_t *request;
-+ njs_opaque_value_t callbacks[2];
-+} ngx_http_js_cb_t;
-+
-+
-+typedef struct {
-+ ngx_http_request_t *request;
- njs_vm_event_t vm_event;
- void *unused;
- ngx_int_t ident;
-@@ -2276,19 +2282,52 @@ static njs_int_t
- ngx_http_js_promise_trampoline(njs_vm_t *vm, njs_value_t *args,
- njs_uint_t nargs, njs_index_t unused)
- {
-+ ngx_uint_t i;
- njs_function_t *callback;
-+ ngx_http_js_cb_t *cb, *cbs;
- ngx_http_js_ctx_t *ctx;
- ngx_http_request_t *r;
-
- r = njs_vm_external(vm, njs_argument(args, 1));
-- ctx = ngx_http_get_module_ctx(r, ngx_http_js_module);
-+ ctx = ngx_http_get_module_ctx(r->parent, ngx_http_js_module);
-
- ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-- "js subrequest promise trampoline ctx: %p", ctx);
--
-- callback = njs_value_function(njs_value_arg(&ctx->promise_callbacks[0]));
-+ "js subrequest promise trampoline parent ctx: %p", ctx);
-+
-+ if (ctx == NULL) {
-+ njs_vm_error(vm, "js subrequest: failed to get the parent context");
-+ return NJS_ERROR;
-+ }
-+
-+ cbs = ctx->promise_callbacks.elts;
-+
-+ if (cbs == NULL) {
-+ goto fail;
-+ }
-+
-+ cb = NULL;
-+
-+ for (i = 0; i < ctx->promise_callbacks.nelts; i++) {
-+ if (cbs[i].request == r) {
-+ cb = &cbs[i];
-+ cb->request = NULL;
-+ break;
-+ }
-+ }
-+
-+ if (cb == NULL) {
-+ goto fail;
-+ }
-+
-+ callback = njs_value_function(njs_value_arg(&cb->callbacks[0]));
-
- return njs_vm_call(vm, callback, njs_argument(args, 1), 1);
-+
-+fail:
-+
-+ njs_vm_error(vm, "js subrequest: promise callback not found");
-+
-+ return NJS_ERROR;
- }
-
-
-@@ -2298,9 +2337,10 @@ ngx_http_js_ext_subrequest(njs_vm_t *vm,
- {
- ngx_int_t rc, promise;
- njs_str_t uri_arg, args_arg, method_name, body_arg;
-- ngx_uint_t method, methods_max, has_body, detached;
-+ ngx_uint_t i, method, methods_max, has_body, detached;
- njs_value_t *value, *arg, *options;
- njs_function_t *callback;
-+ ngx_http_js_cb_t *cb, *cbs;
- ngx_http_js_ctx_t *ctx;
- njs_opaque_value_t lvalue;
- ngx_http_request_t *r, *sr;
-@@ -2507,15 +2547,36 @@ ngx_http_js_ext_subrequest(njs_vm_t *vm,
- }
-
- if (promise) {
-- ctx = ngx_pcalloc(sr->pool, sizeof(ngx_http_js_ctx_t));
-- if (ctx == NULL) {
-- return NGX_ERROR;
-+ cbs = ctx->promise_callbacks.elts;
-+
-+ if (cbs == NULL) {
-+ if (ngx_array_init(&ctx->promise_callbacks, r->pool, 4,
-+ sizeof(ngx_http_js_cb_t)) != NGX_OK)
-+ {
-+ goto memory_error;
-+ }
- }
-
-- ngx_http_set_ctx(sr, ctx, ngx_http_js_module);
-+ cb = NULL;
-+
-+ for (i = 0; i < ctx->promise_callbacks.nelts; i++) {
-+ if (cbs[i].request == NULL) {
-+ cb = &cbs[i];
-+ break;
-+ }
-+ }
-+
-+ if (i == ctx->promise_callbacks.nelts) {
-+ cb = ngx_array_push(&ctx->promise_callbacks);
-+ if (cb == NULL) {
-+ goto memory_error;
-+ }
-+ }
-+
-+ cb->request = sr;
-
- return njs_vm_promise_create(vm, njs_vm_retval(vm),
-- njs_value_arg(&ctx->promise_callbacks));
-+ njs_value_arg(&cb->callbacks));
- }
-
- njs_value_undefined_set(njs_vm_retval(vm));
diff --git a/rpm/SPECS/Makefile.module-njs b/rpm/SPECS/Makefile.module-njs
index 47731ec..d80c047 100644
--- a/rpm/SPECS/Makefile.module-njs
+++ b/rpm/SPECS/Makefile.module-njs
@@ -7,7 +7,6 @@
MODULE_VERSION_PREFIX_njs=$(MODULE_TARGET_PREFIX)
-MODULE_PATCHES_njs=1568-fix-subrequest-error-page.patch
MODULE_SOURCES_njs= njs-$(MODULE_VERSION_njs).tar.gz
MODULE_CONFARGS_njs= --add-dynamic-module=njs-$(MODULE_VERSION_njs)/nginx