Skip to content

Commit b6d0468

Browse files
Alexey Perevalovummakynes
authored andcommitted
netfilter: nfnetlink_acct: avoid using NFACCT_F_OVERQUOTA with bit helper functions
Bit helper functions were used for manipulation with NFACCT_F_OVERQUOTA, but they are accepting pit position, but not a bit mask. As a result not a third bit for NFACCT_F_OVERQUOTA was set, but forth. Such behaviour was dangarous and could lead to unexpected overquota report result. Signed-off-by: Alexey Perevalov <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent d24675c commit b6d0468

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

net/netfilter/nfnetlink_acct.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ struct nf_acct {
4141
};
4242

4343
#define NFACCT_F_QUOTA (NFACCT_F_QUOTA_PKTS | NFACCT_F_QUOTA_BYTES)
44+
#define NFACCT_OVERQUOTA_BIT 2 /* NFACCT_F_OVERQUOTA */
4445

4546
static int
4647
nfnl_acct_new(struct sock *nfnl, struct sk_buff *skb,
@@ -77,7 +78,8 @@ nfnl_acct_new(struct sock *nfnl, struct sk_buff *skb,
7778
smp_mb__before_atomic();
7879
/* reset overquota flag if quota is enabled. */
7980
if ((matching->flags & NFACCT_F_QUOTA))
80-
clear_bit(NFACCT_F_OVERQUOTA, &matching->flags);
81+
clear_bit(NFACCT_OVERQUOTA_BIT,
82+
&matching->flags);
8183
return 0;
8284
}
8385
return -EBUSY;
@@ -150,7 +152,7 @@ nfnl_acct_fill_info(struct sk_buff *skb, u32 portid, u32 seq, u32 type,
150152
bytes = atomic64_xchg(&acct->bytes, 0);
151153
smp_mb__before_atomic();
152154
if (acct->flags & NFACCT_F_QUOTA)
153-
clear_bit(NFACCT_F_OVERQUOTA, &acct->flags);
155+
clear_bit(NFACCT_OVERQUOTA_BIT, &acct->flags);
154156
} else {
155157
pkts = atomic64_read(&acct->pkts);
156158
bytes = atomic64_read(&acct->bytes);
@@ -414,7 +416,7 @@ int nfnl_acct_overquota(const struct sk_buff *skb, struct nf_acct *nfacct)
414416
ret = now > *quota;
415417

416418
if (now >= *quota &&
417-
!test_and_set_bit(NFACCT_F_OVERQUOTA, &nfacct->flags)) {
419+
!test_and_set_bit(NFACCT_OVERQUOTA_BIT, &nfacct->flags)) {
418420
nfnl_overquota_report(nfacct);
419421
}
420422

0 commit comments

Comments
 (0)