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