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)",