Properly handle a case when a first filter returns PFIL_REALLOCED, then

second one returns PFIL_PASS.
This commit is contained in:
Gleb Smirnoff 2019-03-10 17:08:05 +00:00
parent 359d22d4e9
commit b9fdb4b3a3
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=344979

View file

@ -154,7 +154,8 @@ pfil_run_hooks(struct pfil_head *head, pfil_packet_t p, struct ifnet *ifp,
struct epoch_tracker et;
pfil_chain_t *pch;
struct pfil_link *link;
pfil_return_t rv, rvi;
pfil_return_t rv;
bool realloc = false;
if (PFIL_DIR(flags) == PFIL_IN)
pch = &head->head_in;
@ -167,21 +168,22 @@ pfil_run_hooks(struct pfil_head *head, pfil_packet_t p, struct ifnet *ifp,
PFIL_EPOCH_ENTER(et);
CK_STAILQ_FOREACH(link, pch, link_chain) {
if ((flags & PFIL_MEMPTR) && !(link->link_flags & PFIL_MEMPTR))
rvi = pfil_fake_mbuf(link->link_func, p.mem, ifp,
rv = pfil_fake_mbuf(link->link_func, p.mem, ifp,
flags, link->link_ruleset, inp);
else
rvi = (*link->link_func)(p, ifp, flags,
rv = (*link->link_func)(p, ifp, flags,
link->link_ruleset, inp);
if (rvi == PFIL_DROPPED || rvi == PFIL_CONSUMED) {
rv = rvi;
if (rv == PFIL_DROPPED || rv == PFIL_CONSUMED)
break;
} else if (rv == PFIL_REALLOCED) {
else if (rv == PFIL_REALLOCED) {
flags &= ~(PFIL_MEMPTR | PFIL_LENMASK);
rv = rvi;
realloc = true;
}
}
PFIL_EPOCH_EXIT(et);
return (rvi);
if (realloc && rv == PFIL_PASS)
rv = PFIL_REALLOCED;
return (rv);
}
/*