Fwd: perlbal fails on OSX
Brad Fitzpatrick
brad at danga.com
Mon Apr 16 20:24:36 UTC 2007
Fix checked in. New release coming shortly...
On Sat, 14 Apr 2007, Chuck Remes wrote:
> Forwarded to the list in case this bites anyone else... this patch
> works and now all tests pass.
>
> cr
>
> Begin forwarded message:
>
> > From: Radu Greab <radu at yx.ro>
> > Date: April 13, 2007 2:46:38 PM CDT
> > To: cremes.devlist at mac.com
> > Subject: Re: perlbal fails on OSX
> >
> >
> > Hi,
> >
> >> The last packet contains a header where the Content-Length is set to
> >> 31000 bytes. This packet causes the hang. The following code from
> >> Test.pm#resp_from_sock goes into an infinite loop:
> >>
> >> my $cl = $resp->header('Content-Length');
> >> if (defined $cl && $cl > 0) {
> >> my $content = '';
> >> while (($cl -= read($sock, $content, $cl)) > 0) {
> >> # assume an error means connection closed
> >> last if $!;
> >> # don't do anything, the loop is it
> >> }
> >> $resp->content($content);
> >> }
> >>
> >> It sits in that while loop forever because there is no body attached
> >> (it's just a HEAD request) yet the Content-Length > 0.
> >
> > The above code assumes that the loop will be left when a reading
> > from a
> > closed socket is tried (errno will be set). May I ask you to try the
> > change below, which will make the loop finish when EOF is read from
> > the socket?
> >
> >
> > === lib/Perlbal/Test.pm
> > ==================================================================
> > --- lib/Perlbal/Test.pm (revision 75559)
> > +++ lib/Perlbal/Test.pm (local)
> > @@ -189,9 +189,9 @@
> > my $cl = $resp->header('Content-Length');
> > if (defined $cl && $cl > 0) {
> > my $content = '';
> > - while (($cl -= read($sock, $content, $cl)) > 0) {
> > - # assume an error means connection closed
> > - last if $!;
> > + my $rv;
> > + while (($rv = read($sock, $content, $cl)) &&
> > + ($cl -= $rv) > 0) {
> > # don't do anything, the loop is it
> > }
> > $resp->content($content);
> >
>
>
More information about the perlbal
mailing list