On Fri, 12 Nov 2010, Clinton Gormley wrote:
> On Fri, 2010-11-12 at 11:59 -0800, Mark Hedges wrote:
> >
> > Sorry if I don't understand what's going on, but is this a
> > bug that causes the cookie header to have only the value '1'
> > instead of proper headers?
> >
> > https://rt.cpan.org/Public/Bug/Display.html?id=61744
> >
> > Since there's some activity/interest in a new release,
> > maybe someone can offer their opinion whether the
> > suggested fix in the bug report above is a good idea, or
> > whether this is something that needs to be fixed in
> > Apache2::Cookie. I haven't been able to duplicate it--
> > maybe because I use Debian?
>
> I had a read of your bug and the conversation it links to.
> This isn't a bug in libapreq or Apache2::Cookie - some
> process somewhere (and it could be from an advert on the
> user's site) is setting an invalid cookie, which then gets
> passed back to apache.
>
> Apache2::Cookie tries to parse it, and chokes on it,
> throwing an error. However, you can change how you use
> Apache2::Cookie to ignore the error and just retrieve
> valid cookies as discussed in the conversation linked to
> in that bug report:
> http://comments.gmane.org/gmane.comp.apache.apreq/4477
>
> clint
Could Apache2::Cookie::Jar maybe have an option to skip
NOTOKEN errors when reading the jar? Then it would do
something like below. Or does the eval have to happen in
the 'each %attrs' loop of Jar->new().
It just seems like this is a universal problem. If the
client presents a bad cookie, shouldn't we just ignore it?
It may be unrealistic to demand that the world be free of
buggy browsers.
--mark--
--- /usr/lib/perl5/Apache2/Cookie.pm.orig 2010-12-21 15:05:24.000000000 -0800
+++ /usr/lib/perl5/Apache2/Cookie.pm 2010-12-21 15:21:22.000000000 -0800
@@ -4,6 +4,7 @@
use APR::Request::Cookie;
use APR::Request::Apache2;
use APR::Request qw/encode decode/;
+use APR::Request::Error ();
use Apache2::RequestRec;
use Apache2::RequestUtil;
use overload '""' => sub { shift->as_string() }, fallback => 1;
@@ -101,8 +102,21 @@
*Apache2::Cookie::Jar::status = *APR::Request::jar_status;
sub new {
- my $class = shift;
- my $jar = $class->APR::Request::Apache2::handle(shift);
+ my ($class, $r) = @_;
+ my $jar;
+ eval { $jar = $class->APR::Request::Apache2::handle($r) };
+ if (my $err = $@) {
+ my $ref = ref $err;
+ if ( $ref eq 'APR::Request::Error'
+ && $err == APR::Request::Error::NOTOKEN
+ ) {
+ # skip bad cookies by getting jar from error
+ $jar = $err->jar;
+ }
+ else {
+ die $err; # rethrows any other APR::Error
+ }
+ }
my %attrs = @_;
while (my ($k, $v) = each %attrs) {
$k =~ s/^-//;