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
  
  
  

Reply via email to