Welcome! Log In Create A New Profile

Advanced

[nginx] Perl: added PERL_SET_INTERP().

Maxim Dounin
December 07, 2016 12:50PM
details: http://hg.nginx.org/nginx/rev/eada22643e8b
branches:
changeset: 6820:eada22643e8b
user: Maxim Dounin <mdounin@mdounin.ru>
date: Wed Dec 07 19:03:19 2016 +0300
description:
Perl: added PERL_SET_INTERP().

For Perl compiled with threads, without PERL_SET_INTERP() the PL_curinterp
remains set to the first interpreter created (that is, one created at
original start). As a result after a reload Perl thinks that operations
are done withing a thread, and, most notably, denies to change environment.

For example, the following code properly works on original start,
but fails after a reload:

perl 'sub {
my $r = shift;

$r->send_http_header("text/plain");

$ENV{TZ} = "UTC";
$r->print("tz: " . $ENV{TZ} . " (localtime " . (localtime()) . ")\n");
$ENV{TZ} = "Europe/Moscow";
$r->print("tz: " . $ENV{TZ} . " (localtime " . (localtime()) . ")\n");

return OK;
}';

To fix this, PERL_SET_INTERP() added anywhere where PERL_SET_CONTEXT()
was previously used.

Note that PERL_SET_INTERP() doesn't seem to be documented anywhere.
Yet it is used in some other software, and also seems to be the only
solution possible.

diffstat:

src/http/modules/perl/ngx_http_perl_module.c | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)

diffs (67 lines):

diff --git a/src/http/modules/perl/ngx_http_perl_module.c b/src/http/modules/perl/ngx_http_perl_module.c
--- a/src/http/modules/perl/ngx_http_perl_module.c
+++ b/src/http/modules/perl/ngx_http_perl_module.c
@@ -207,6 +207,7 @@ ngx_http_perl_handle_request(ngx_http_re

dTHXa(pmcf->perl);
PERL_SET_CONTEXT(pmcf->perl);
+ PERL_SET_INTERP(pmcf->perl);

if (ctx->next == NULL) {
plcf = ngx_http_get_module_loc_conf(r, ngx_http_perl_module);
@@ -322,6 +323,7 @@ ngx_http_perl_variable(ngx_http_request_

dTHXa(pmcf->perl);
PERL_SET_CONTEXT(pmcf->perl);
+ PERL_SET_INTERP(pmcf->perl);

rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, pv->sub, NULL,
&pv->handler, &value);
@@ -387,6 +389,7 @@ ngx_http_perl_ssi(ngx_http_request_t *r,

dTHXa(pmcf->perl);
PERL_SET_CONTEXT(pmcf->perl);
+ PERL_SET_INTERP(pmcf->perl);

#if 0

@@ -568,6 +571,7 @@ ngx_http_perl_create_interpreter(ngx_con

dTHXa(perl);
PERL_SET_CONTEXT(perl);
+ PERL_SET_INTERP(perl);

perl_construct(perl);

@@ -828,6 +832,7 @@ ngx_http_perl_cleanup_perl(void *data)
PerlInterpreter *perl = data;

PERL_SET_CONTEXT(perl);
+ PERL_SET_INTERP(perl);

(void) perl_destruct(perl);

@@ -936,6 +941,7 @@ ngx_http_perl(ngx_conf_t *cf, ngx_comman

dTHXa(pmcf->perl);
PERL_SET_CONTEXT(pmcf->perl);
+ PERL_SET_INTERP(pmcf->perl);

ngx_http_perl_eval_anon_sub(aTHX_ &value[1], &plcf->sub);

@@ -1007,6 +1013,7 @@ ngx_http_perl_set(ngx_conf_t *cf, ngx_co

dTHXa(pmcf->perl);
PERL_SET_CONTEXT(pmcf->perl);
+ PERL_SET_INTERP(pmcf->perl);

ngx_http_perl_eval_anon_sub(aTHX_ &value[2], &pv->sub);

@@ -1039,6 +1046,7 @@ ngx_http_perl_init_worker(ngx_cycle_t *c
if (pmcf) {
dTHXa(pmcf->perl);
PERL_SET_CONTEXT(pmcf->perl);
+ PERL_SET_INTERP(pmcf->perl);

/* set worker's $$ */

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Perl: added PERL_SET_INTERP().

Maxim Dounin 816 December 07, 2016 12:50PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 143
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready