Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Apr 2012 11:10:03 GMT
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        freebsd-pf@FreeBSD.org
Subject:   kern/164402: [pf] pf crashes with a particular set of rules when first matching packet arrives
Message-ID:  <201204151110.q3FBA3Fr034331@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/164402; it has been noted by GNATS.

From: Gleb Smirnoff <glebius@FreeBSD.org>
To: "Eugene M. Zheganin" <eugene@zhegan.in>
Cc: bug-followup@FreeBSD.org
Subject: kern/164402: [pf] pf crashes with a particular set of rules when
 first matching packet arrives
Date: Sun, 15 Apr 2012 15:07:56 +0400

   Hi,
 
   I have a vague suspicion on what is happening. Your description of
 the problem looks like if a packet processing in the kernel has entered
 an endless loop.
 
   Looking at pf_route() I see such possibility. From OpenBSD we have
 this protection against endless looping:
 
         if ((*m)->m_pkthdr.pf.routed++ > 3) {
                 m0 = *m;
                 *m = NULL;
                 goto bad;
         }
 
 In our code this transforms to:
 
         if (pd->pf_mtag->routed++ > 3) {
                 m0 = *m;
                 *m = NULL;
                 goto bad;
         }
 
 The root difference between storing the tag on mbuf and on pfdesc
 is that we lose pfdesc, and thus the tag, when we enter pf_test()
 recursively. And pf_route() does this recursion:
 
         if (oifp != ifp) {
                 if (pf_test(PF_OUT, ifp, &m0, NULL) != PF_PASS) {
                         goto bad;
 	....
 
 -- 
 Totus tuus, Glebius.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204151110.q3FBA3Fr034331>