Author: torsten
Date: Wed Apr  7 11:20:01 2010
New Revision: 931503

URL: http://svn.apache.org/viewvc?rev=931503&view=rev
Log:
Make sure buffer is a valid SV in modperl_filter_read()

Modified:
    perl/modperl/trunk/Changes
    perl/modperl/trunk/src/modules/perl/modperl_filter.c

Modified: perl/modperl/trunk/Changes
URL: 
http://svn.apache.org/viewvc/perl/modperl/trunk/Changes?rev=931503&r1=931502&r2=931503&view=diff
==============================================================================
--- perl/modperl/trunk/Changes (original)
+++ perl/modperl/trunk/Changes Wed Apr  7 11:20:01 2010
@@ -12,6 +12,11 @@ Also refer to the Apache::Test changes l
 
 =item 2.0.5-dev
 
+Make sure buffer is a valid SV in modperl_filter_read() [Torsten Foertsch]
+
+Move modperl_response_finish() out of modperl_response_handler_run in
+mod_perl.c [Torsten Foertsch]
+
 "MODPERL_INC= now correctly supported as an argument to Makefile.PL"
 [Torsten Foertsch]
 

Modified: perl/modperl/trunk/src/modules/perl/modperl_filter.c
URL: 
http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_filter.c?rev=931503&r1=931502&r2=931503&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_filter.c (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_filter.c Wed Apr  7 11:20:01 
2010
@@ -654,9 +654,14 @@ MP_INLINE static apr_size_t modperl_filt
     apr_size_t len = 0;
 
     (void)SvUPGRADE(buffer, SVt_PV);
-    SvPOK_only(buffer);
     SvCUR(buffer) = 0;
 
+    /* calling SvPOK_only here may leave buffer an invalid state since
+     * SvPVX may be NULL. But it's very likely that something is copied.
+     * So, we turn the POK flag on here. Later we check if SvPVX is NULL
+     * and turn the flag off again if so. */
+    SvPOK_only(buffer);
+
     /* sometimes the EOS bucket arrives in the same brigade with other
      * buckets, so that particular read() will not return 0 and will
      * be called again if called in the while ($filter->read(...))
@@ -682,6 +687,7 @@ MP_INLINE static apr_size_t modperl_filt
                        wanted,
                        MP_TRACE_STR_TRUNC(filter->pool, filter->leftover, 
wanted),
                        filter->remaining);
+            SvGROW(buffer, wanted+1);
             sv_catpvn(buffer, filter->leftover, wanted);
             filter->leftover += wanted;
             filter->remaining -= wanted;
@@ -692,6 +698,7 @@ MP_INLINE static apr_size_t modperl_filt
                        "eating remaining %db",
                        MP_FILTER_NAME(filter->f),
                        filter->remaining);
+            SvGROW(buffer, filter->remaining+1);
             sv_catpvn(buffer, filter->leftover, filter->remaining);
             len = filter->remaining;
             filter->remaining = 0;
@@ -728,6 +735,7 @@ MP_INLINE static apr_size_t modperl_filt
         if (buf_len) {
             if ((SvCUR(buffer) + buf_len) >= wanted) {
                 int nibble = wanted - SvCUR(buffer);
+                SvGROW(buffer, SvCUR(buffer)+nibble+1);
                 sv_catpvn(buffer, buf, nibble);
                 filter->leftover = (char *)buf+nibble;
                 filter->remaining = buf_len - nibble;
@@ -736,11 +744,16 @@ MP_INLINE static apr_size_t modperl_filt
             }
             else {
                 len += buf_len;
+                SvGROW(buffer, SvCUR(buffer)+buf_len+1);
                 sv_catpvn(buffer, buf, buf_len);
             }
         }
     }
 
+    if (!SvPVX(buffer)) {
+        SvPOK_off(buffer);
+    }
+
     MP_TRACE_f(MP_FUNC,
                MP_FILTER_NAME_FORMAT
                "return: %db from %d bucket%s [%s]\n\t(%db leftover)",


Reply via email to