netfilter: xtables: avoid pointer to self
Commit 784544739a (netfilter: iptables:
lock free counters) broke a number of modules whose rule data referenced
itself. A reallocation would not reestablish the correct references, so
it is best to use a separate struct that does not fall under RCU.
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
Signed-off-by: Patrick McHardy <kaber@trash.net>
This commit is contained in:
committed by
Patrick McHardy
parent
95ba434f89
commit
acc738fec0
@@ -4,6 +4,8 @@
|
||||
/* timings are in milliseconds. */
|
||||
#define XT_LIMIT_SCALE 10000
|
||||
|
||||
struct xt_limit_priv;
|
||||
|
||||
/* 1/10,000 sec period => max of 10,000/sec. Min rate is then 429490
|
||||
seconds, or one every 59 hours. */
|
||||
struct xt_rateinfo {
|
||||
@@ -11,11 +13,10 @@ struct xt_rateinfo {
|
||||
u_int32_t burst; /* Period multiplier for upper limit. */
|
||||
|
||||
/* Used internally by the kernel */
|
||||
unsigned long prev;
|
||||
u_int32_t credit;
|
||||
unsigned long prev; /* moved to xt_limit_priv */
|
||||
u_int32_t credit; /* moved to xt_limit_priv */
|
||||
u_int32_t credit_cap, cost;
|
||||
|
||||
/* Ugly, ugly fucker. */
|
||||
struct xt_rateinfo *master;
|
||||
struct xt_limit_priv *master;
|
||||
};
|
||||
#endif /*_XT_RATE_H*/
|
||||
|
||||
@@ -6,13 +6,15 @@ enum xt_quota_flags {
|
||||
};
|
||||
#define XT_QUOTA_MASK 0x1
|
||||
|
||||
struct xt_quota_priv;
|
||||
|
||||
struct xt_quota_info {
|
||||
u_int32_t flags;
|
||||
u_int32_t pad;
|
||||
|
||||
/* Used internally by the kernel */
|
||||
aligned_u64 quota;
|
||||
struct xt_quota_info *master;
|
||||
struct xt_quota_priv *master;
|
||||
};
|
||||
|
||||
#endif /* _XT_QUOTA_H */
|
||||
|
||||
@@ -13,6 +13,8 @@ enum xt_statistic_flags {
|
||||
};
|
||||
#define XT_STATISTIC_MASK 0x1
|
||||
|
||||
struct xt_statistic_priv;
|
||||
|
||||
struct xt_statistic_info {
|
||||
u_int16_t mode;
|
||||
u_int16_t flags;
|
||||
@@ -23,11 +25,10 @@ struct xt_statistic_info {
|
||||
struct {
|
||||
u_int32_t every;
|
||||
u_int32_t packet;
|
||||
/* Used internally by the kernel */
|
||||
u_int32_t count;
|
||||
u_int32_t count; /* unused */
|
||||
} nth;
|
||||
} u;
|
||||
struct xt_statistic_info *master __attribute__((aligned(8)));
|
||||
struct xt_statistic_priv *master __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
#endif /* _XT_STATISTIC_H */
|
||||
|
||||
Reference in New Issue
Block a user