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/^-//;

Reply via email to