gozer 2004/08/09 17:38:36
Modified: . Changes
src/modules/perl modperl_filter.c
t/filter/TestFilter out_str_eval.pm
todo release
Log:
Filters should not reset $@ if it was already set before invocation.
Perl_warn if an filter error occurs while a previous error already
existed to avoid completely losing the error message.
Reviewed by: stas
Revision Changes Path
1.432 +3 -0 modperl-2.0/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/modperl-2.0/Changes,v
retrieving revision 1.431
retrieving revision 1.432
diff -u -r1.431 -r1.432
--- Changes 9 Aug 2004 21:42:34 -0000 1.431
+++ Changes 10 Aug 2004 00:38:35 -0000 1.432
@@ -12,6 +12,9 @@
=item 1.99_15-dev
+Filters should not reset $@ if it was already set before
+invocation [Gozer]
+
Apache::compat server_root_relative now correctly handles absolute
paths like ap_server_root_relative does [Gozer]
1.94 +35 -0 modperl-2.0/src/modules/perl/modperl_filter.c
Index: modperl_filter.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -r1.93 -r1.94
--- modperl_filter.c 2 Jun 2004 21:35:58 -0000 1.93
+++ modperl_filter.c 10 Aug 2004 00:38:35 -0000 1.94
@@ -54,6 +54,36 @@
} \
safefree(filter);
+/* Save the value of $@ if it was set */
+#define MP_FILTER_SAVE_ERRSV(tmpsv) \
+ if (SvTRUE(ERRSV)) { \
+ tmpsv = newSVsv(ERRSV); \
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT \
+ "Saving [EMAIL PROTECTED]'%s'", \
+ MP_FILTER_NAME(filter->f), \
+ SvPVX(tmpsv) \
+ ); \
+ }
+
+/* Restore previously saved value of $@, warning if a new error was generated */
+#define MP_FILTER_RESTORE_ERRSV(tmpsv) \
+ if (tmpsv) { \
+ if (SvTRUE(ERRSV)) { \
+ Perl_warn(aTHX_ "%s", SvPVX(ERRSV)); \
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT \
+ "error: %s", \
+ MP_FILTER_NAME(filter->f), \
+ SvPVX(ERRSV) \
+ ); \
+ } \
+ sv_setsv(ERRSV, tmpsv); \
+ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT \
+ "Restoring [EMAIL PROTECTED]'%s'", \
+ MP_FILTER_NAME(filter->f), \
+ SvPVX(tmpsv) \
+ ); \
+ }
+
/* this function is for tracing only, it's not optimized for performance */
static int is_modperl_filter(ap_filter_t *f)
{
@@ -432,6 +462,7 @@
int modperl_run_filter(modperl_filter_t *filter)
{
AV *args = Nullav;
+ SV *errsv = Nullsv;
int status;
modperl_handler_t *handler =
((modperl_filter_ctx_t *)filter->f->ctx)->handler;
@@ -443,6 +474,8 @@
MP_dINTERP_SELECT(r, c, s);
+ MP_FILTER_SAVE_ERRSV(errsv);
+
modperl_handler_make_args(aTHX_ &args,
"Apache::Filter", filter->f,
"APR::Brigade",
@@ -503,6 +536,8 @@
MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
"return: %d\n", modperl_handler_name(handler), status);
+ MP_FILTER_RESTORE_ERRSV(errsv);
+
return status;
}
1.4 +2 -3 modperl-2.0/t/filter/TestFilter/out_str_eval.pm
Index: out_str_eval.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/out_str_eval.pm,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- out_str_eval.pm 3 Jul 2004 18:45:46 -0000 1.3
+++ out_str_eval.pm 10 Aug 2004 00:38:35 -0000 1.4
@@ -25,9 +25,8 @@
sub response {
my $r = shift;
- plan $r, tests => 1, todo => [1];
- # XXX: see if we can fix filter handlers to restore the original
- # $@ when the callback completes
+ plan $r, tests => 1;
+ # test that filters don't reset $@
eval { i_do_not_exist_really_i_do_not() };
# trigger the filter invocation, before using $@
$r->print("# whatever");
1.42 +0 -5 modperl-2.0/todo/release
Index: release
===================================================================
RCS file: /home/cvs/modperl-2.0/todo/release,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- release 9 Aug 2004 21:42:35 -0000 1.41
+++ release 10 Aug 2004 00:38:35 -0000 1.42
@@ -8,11 +8,6 @@
http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=108967266419527&w=2
owner: gozer
-* filters reset $@ generated by eval, see if we can fix that. The TODO
- test: TestFilter::out_str_eval presents the case
- The description is here:
- http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=108639632031457&w=2
-
* on windows $pool->clean, followed by $pool->destroy breaks other tests
See test TestAPR::pool
http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=108547894817083&w=2