Re: [PATCH] END blocks may segfault

Alex Hunsaker <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <[email protected]>
>>> On Wed, Jun 30, 2010 at 02:49, Tim Bunce <[email protected]> wrote:
>>> > I suggest the code shift items off the main array, like perl does,
>>> > but also push those items onto a new temp array.

Find attached a patch that does the above (perhaps naively), passes a
make test and fixes the reported problems for me.
modperl_util_call_list_shift.patch (text/x-patch, 1.3 KB)
diff --git a/src/modules/perl/modperl_util.c b/src/modules/perl/modperl_util.c
index ce95466..7a74be0 100644
--- a/src/modules/perl/modperl_util.c
+++ b/src/modules/perl/modperl_util.c
@@ -467,19 +467,22 @@ void modperl_perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg)
 
 void modperl_perl_call_list(pTHX_ AV *subs, const char *name)
 {
-    I32 i, oldscope = PL_scopestack_ix;
-    SV **ary = AvARRAY(subs);
+    I32 oldscope = PL_scopestack_ix;
+    AV *tmpav = newAV();
+
+    av_extend(tmpav, AvFILLp(subs));
 
     MP_TRACE_g(MP_FUNC, "pid %lu" MP_TRACEf_TID MP_TRACEf_PERLID
                " running %d %s subs",
                (unsigned long)getpid(), MP_TRACEv_TID_ MP_TRACEv_PERLID_
                AvFILLp(subs)+1, name);
 
-    for (i=0; i<=AvFILLp(subs); i++) {
-        CV *cv = (CV*)ary[i];
+    while (av_len(subs) >= 0) {
+        CV *cv = (CV*)av_shift(subs);
         SV *atsv = ERRSV;
 
         PUSHMARK(PL_stack_sp);
+        av_push(tmpav, (SV*)cv);
         call_sv((SV*)cv, G_EVAL|G_DISCARD);
 
         if (SvCUR(atsv)) {
@@ -491,6 +494,11 @@ void modperl_perl_call_list(pTHX_ AV *subs, const char *name)
             Perl_croak(aTHX_ "%s", SvPVX(atsv));
         }
     }
+
+    while (av_len(tmpav) >= 0) {
+        av_push(subs, av_shift(tmpav));
+    }
+    sv_free((SV*)tmpav);
 }
 
 void modperl_perl_exit(pTHX_ int status)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.