View | Details | Raw Unified | Return to bug 209459
Collapse All | Expand All

(-)../../home/pi/myp/www/mod_perl2/Makefile (-5 / +1 lines)
Lines 3-8 Link Here
3
3
4
PORTNAME=	mod_perl
4
PORTNAME=	mod_perl
5
PORTVERSION=	2.0.9
5
PORTVERSION=	2.0.9
6
PORTREVISION=	1
6
PORTEPOCH=	3
7
PORTEPOCH=	3
7
CATEGORIES=	www perl5
8
CATEGORIES=	www perl5
8
MASTER_SITES=	APACHE/perl
9
MASTER_SITES=	APACHE/perl
Lines 32-42 Link Here
32
33
33
.include <bsd.port.pre.mk>
34
.include <bsd.port.pre.mk>
34
35
35
.if ${PERL_VER} == 5.22
36
BROKEN=		PERL ${PERL_VER} is not supported by upstream,\
37
		see http://svn.apache.org/viewvc/perl/modperl/trunk/README?view=markup
38
.endif
39
40
# Provider is build iff apache24 is in use
36
# Provider is build iff apache24 is in use
41
.if ${APACHE_VERSION:M22}
37
.if ${APACHE_VERSION:M22}
42
PLIST_SUB+=	AP22="@comment "
38
PLIST_SUB+=	AP22="@comment "
(-)../../home/pi/myp/www/mod_perl2/files/patch-src_modules_perl_mod__perl.c (+30 lines)
Line 0 Link Here
1
--- src/modules/perl/mod_perl.c.orig	2015-06-18 22:13:55.000000000 +0200
2
+++ src/modules/perl/mod_perl.c	2016-05-11 20:35:19.285089000 +0200
3
@@ -262,6 +262,8 @@
4
         exit(1);
5
     }
6
 
7
+    modperl_env_init(aTHX);
8
+
9
     /* suspend END blocks to be run at server shutdown */
10
     endav = PL_endav;
11
     PL_endav = (AV *)NULL;
12
@@ -576,9 +578,6 @@
13
     /* modifies PL_ppaddr */
14
     modperl_perl_pp_set_all();
15
 
16
-    /* modifies PL_vtbl_env{elem} */
17
-    modperl_env_init();
18
-
19
     return APR_SUCCESS;
20
 }
21
 
22
@@ -597,8 +596,6 @@
23
 
24
     MP_TRACE_i(MP_FUNC, "mod_perl sys term");
25
 
26
-    modperl_env_unload();
27
-
28
     modperl_perl_pp_unset_all();
29
 
30
     PERL_SYS_TERM();
(-)../../home/pi/myp/www/mod_perl2/files/patch-src_modules_perl_modperl__env.c (+132 lines)
Line 0 Link Here
1
--- src/modules/perl/modperl_env.c.orig	2015-06-18 22:13:54.000000000 +0200
2
+++ src/modules/perl/modperl_env.c	2016-05-11 21:06:13.364008000 +0200
3
@@ -121,6 +121,7 @@
4
     const apr_array_header_t *array;
5
     apr_table_entry_t *elts;
6
 
7
+    modperl_env_init(aTHX);
8
     modperl_env_untie(mg_flags);
9
 
10
     array = apr_table_elts(table);
11
@@ -434,11 +435,8 @@
12
 /* to store the original virtual tables
13
  * these are global, not per-interpreter
14
  */
15
-static MGVTBL MP_PERL_vtbl_env;
16
-static MGVTBL MP_PERL_vtbl_envelem;
17
-
18
 #define MP_PL_vtbl_call(name, meth) \
19
-    MP_PERL_vtbl_##name.svt_##meth(aTHX_ sv, mg)
20
+    PL_vtbl_##name.svt_##meth(aTHX_ sv, mg)
21
 
22
 #define MP_dENV_KEY \
23
     STRLEN klen; \
24
@@ -612,16 +610,22 @@
25
 }
26
 #endif
27
 
28
+static int modperl_env_magic_copy(pTHX_ SV *sv, MAGIC *mg, SV *nsv, const char *name, I32 namlen);
29
+static int modperl_env_magic_local_all(pTHX_ SV *nsv, MAGIC *mg);
30
+
31
 /* override %ENV virtual tables with our own */
32
 static MGVTBL MP_vtbl_env = {
33
     0,
34
     modperl_env_magic_set_all,
35
     0,
36
     modperl_env_magic_clear_all,
37
-    0
38
+    0,
39
+    modperl_env_magic_copy,
40
+    0,
41
+    modperl_env_magic_local_all
42
 };
43
 
44
-static MGVTBL MP_vtbl_envelem = {
45
+MGVTBL MP_vtbl_envelem = {
46
     0,
47
     modperl_env_magic_set,
48
     0,
49
@@ -629,22 +633,70 @@
50
     0
51
 };
52
 
53
-void modperl_env_init(void)
54
+static int modperl_env_magic_copy(pTHX_ SV *sv, MAGIC *mg, SV *nsv, const char *name, I32 namlen)
55
 {
56
     /* save originals */
57
-    StructCopy(&PL_vtbl_env, &MP_PERL_vtbl_env, MGVTBL);
58
-    StructCopy(&PL_vtbl_envelem, &MP_PERL_vtbl_envelem, MGVTBL);
59
-
60
-    /* replace with our versions */
61
-    StructCopy(&MP_vtbl_env, &PL_vtbl_env, MGVTBL);
62
-    StructCopy(&MP_vtbl_envelem, &PL_vtbl_envelem, MGVTBL);
63
-}
64
+    MP_TRACE_e(MP_FUNC, "setting up %%ENV element magic");
65
+    sv_magicext(nsv, mg->mg_obj,
66
+		toLOWER(mg->mg_type), &MP_vtbl_envelem, name, namlen);
67
+
68
+    return 1;
69
+}
70
+
71
+static int modperl_env_magic_local_all(pTHX_ SV *nsv, MAGIC *mg)
72
+{
73
+    MAGIC *nmg;
74
+    MP_TRACE_e(MP_FUNC, "localizing %%ENV");
75
+    nmg = sv_magicext(nsv, mg->mg_obj,
76
+		mg->mg_type, &MP_vtbl_env, NULL, 0);
77
+    nmg->mg_ptr = mg->mg_ptr;
78
+    nmg->mg_flags |= MGf_COPY;
79
+    nmg->mg_flags |= MGf_LOCAL;
80
+
81
+    return 1;
82
+}
83
+
84
+void modperl_env_init(pTHX)
85
+{
86
+    MAGIC *mg;
87
+    /* Remove existing 'E' magic from %ENV */
88
+    /* TODO: Should check there is not multiple 'E' magic! */
89
+    if (!my_perl)
90
+	return;
91
+    if (!PL_envgv)
92
+	return;
93
+    if (!SvRMAGICAL(ENVHV))
94
+	return;
95
+    mg = mg_find((const SV *)ENVHV, PERL_MAGIC_env);
96
+    if (!mg)
97
+	return;
98
+    if (mg->mg_virtual == &MP_vtbl_env)
99
+	return;
100
+    MP_TRACE_d(MP_FUNC, "ptr: %x obj: %x flags:%x", mg->mg_ptr, mg->mg_obj, mg->mg_flags);
101
+    mg_free_type((SV*)ENVHV, PERL_MAGIC_env);
102
+
103
+    /* Add our version instead */
104
+    mg = sv_magicext((SV*)ENVHV, (SV*)NULL, PERL_MAGIC_env, &MP_vtbl_env, (char*)NULL, 0);
105
+    mg->mg_flags |= MGf_COPY;
106
+    mg->mg_flags |= MGf_LOCAL;
107
+}
108
+
109
+void modperl_env_unload(pTHX)
110
+{
111
+    /* Remove our 'E' magic from %ENV */
112
+    /* TODO: Should check there is not multiple 'E' magic! */
113
+    if (!my_perl)
114
+	return;
115
+    if (!PL_envgv)
116
+	return;
117
+    if (!SvRMAGICAL(ENVHV))
118
+	return;
119
+    if (!mg_find((const SV *)ENVHV, PERL_MAGIC_env))
120
+	return;
121
+    mg_free_type((SV*)ENVHV, PERL_MAGIC_env);
122
 
123
-void modperl_env_unload(void)
124
-{
125
-    /* restore originals */
126
-    StructCopy(&MP_PERL_vtbl_env, &PL_vtbl_env, MGVTBL);
127
-    StructCopy(&MP_PERL_vtbl_envelem, &PL_vtbl_envelem, MGVTBL);
128
+    /* Restore original */
129
+    sv_magicext((SV*)ENVHV, (SV*)NULL, PERL_MAGIC_env, &PL_vtbl_env, (char*)NULL, 0);
130
 }
131
 
132
 /*
(-)../../home/pi/myp/www/mod_perl2/files/patch-src_modules_perl_modperl__env.h (+25 lines)
Line 0 Link Here
1
--- src/modules/perl/modperl_env.h.orig	2016-05-11 21:36:26.176077000 +0200
2
+++ src/modules/perl/modperl_env.h	2016-05-11 21:37:37.854775000 +0200
3
@@ -28,7 +28,7 @@
4
     MP_magical_tie(ENVHV, mg_flags)
5
 
6
 #define modperl_envelem_tie(sv, key, klen) \
7
-    sv_magic(sv, (SV *)NULL, 'e', key, klen)
8
+    sv_magicext(sv, (SV *)NULL, PERL_MAGIC_envelem, &MP_vtbl_envelem, key, klen)
9
 
10
 void modperl_env_hash_keys(pTHX);
11
 
12
@@ -58,9 +58,11 @@
13
 
14
 void modperl_env_request_untie(pTHX_ request_rec *r);
15
 
16
-void modperl_env_init(void);
17
+void modperl_env_init(pTHX);
18
 
19
-void modperl_env_unload(void);
20
+void modperl_env_unload(pTHX);
21
+
22
+MGVTBL MP_vtbl_envelem;
23
 
24
 #endif /* MODPERL_ENV_H */
25
 
(-)../../home/pi/myp/www/mod_perl2/files/patch-src_modules_perl_modperl__perl.c (+11 lines)
Line 0 Link Here
1
--- src/modules/perl/modperl_perl.c.orig	2015-06-18 22:13:55.000000000 +0200
2
+++ src/modules/perl/modperl_perl.c	2016-05-11 21:07:47.180082000 +0200
3
@@ -181,6 +181,8 @@
4
         }
5
     }
6
 
7
+    modperl_env_unload(perl);
8
+
9
     perl_destruct(perl);
10
 
11
     /* XXX: big bug in 5.6.1 fixed in 5.7.2+
(-)../../home/pi/myp/www/mod_perl2/files/patch-t_response_TestModperl_env.pm (+20 lines)
Line 0 Link Here
1
--- t/response/TestModperl/env.pm.orig	2015-06-18 22:13:58.000000000 +0200
2
+++ t/response/TestModperl/env.pm	2016-05-11 21:09:00.010061000 +0200
3
@@ -15,7 +15,7 @@
4
 sub handler {
5
     my $r = shift;
6
 
7
-    plan $r, tests => 23 + keys(%ENV);
8
+    plan $r, tests => 23 + 3 * keys(%ENV);
9
 
10
     my $env = $r->subprocess_env;
11
 
12
@@ -75,6 +75,8 @@
13
     for my $key (sort keys %ENV) {
14
         eval { delete $ENV{$key}; };
15
         ok t_cmp($@, '', $key);
16
+	ok t_cmp($ENV{$key}, undef, "ENV{$key} is empty");
17
+	ok t_cmp($env->get($key), undef, "subprocess_env($key) is empty");
18
     }
19
 
20
     Apache2::Const::OK;

Return to bug 209459