Stas Bekman <[EMAIL PROTECTED]> writes:

> There are two problems with modperl sv buckets. You use modperl sv
> buckets when you say:
> 
>    APR::Bucket->new($data);
> 
> 1) If you change $data after creating the bucket, the data in the
> bucket is modified as well. This could lead to unexpected behavior and
> bugs, but with proper documentation it should probably be OK. A better
> solution is to turn the sv into READONLY.
>
> 2) temporary svs cause buckets corruption.
> 
> If you create a real variable, and pass it to APR::Bucket->new() it'll
> get its refcount incremented to ensure that it won't be destroyed by
> Perl. The problem is when new() gets the same SV to create different
> buckets. This is the case with temporary SVs, Perl will re-use the
> same sv again and again when it needs a temp. As the following code
> demonstrates calling APR::Bucket->new(lc $data) passes a temp SV to
> new() and it'll store the same sv address for different buckets. so
> the data of the last bucket will corrupt the data of all the previous
> buckets, since they share the PV slot. Observe for youself:

I haven't looked at the bucket implementation, but FWIW this is
exactly how transient buckets behave in apache's filter stack
(mod_ssl generates these in the input filter chain).  You might
want to implement a setaside callback for sv buckets that would 
copy the SvPVX into a pool-allocated string when called (and presumably 
turn the bucket into a normal pool bucket at that point?).

If you had a setaside, then instead of (or in addition to?)
marking the sv READONLY it might be possible to add setmagic to the sv
that invokes the new setaside callback. That way the sv and the old
bucket might be decoupled when the sv is reassigned, and perhaps
at that point the READONLY flag could be dropped.  

It would certainly require some planning efforts to coordinate
everything,  but I believe it's possible to do something like this.

-- 
Joe Schaefer


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to