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