diff options
author | Jan Engelhardt <jengelh@medozas.de> | 2009-03-16 10:35:29 -0400 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2009-03-16 10:35:29 -0400 |
commit | acc738fec03bdaa5b77340c32a82fbfedaaabef0 (patch) | |
tree | 646495518d8e4946862ab9d361eb2248d4212be5 /include | |
parent | 95ba434f898c3cb5c7457dce265bf0ab72ba8ce9 (diff) |
netfilter: xtables: avoid pointer to self
Commit 784544739a25c30637397ace5489eeb6e15d7d49 (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>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/netfilter/xt_limit.h | 9 | ||||
-rw-r--r-- | include/linux/netfilter/xt_quota.h | 4 | ||||
-rw-r--r-- | include/linux/netfilter/xt_statistic.h | 7 |
3 files changed, 12 insertions, 8 deletions
diff --git a/include/linux/netfilter/xt_limit.h b/include/linux/netfilter/xt_limit.h index b3ce65375ecb..fda222c7953b 100644 --- a/include/linux/netfilter/xt_limit.h +++ b/include/linux/netfilter/xt_limit.h | |||
@@ -4,6 +4,8 @@ | |||
4 | /* timings are in milliseconds. */ | 4 | /* timings are in milliseconds. */ |
5 | #define XT_LIMIT_SCALE 10000 | 5 | #define XT_LIMIT_SCALE 10000 |
6 | 6 | ||
7 | struct xt_limit_priv; | ||
8 | |||
7 | /* 1/10,000 sec period => max of 10,000/sec. Min rate is then 429490 | 9 | /* 1/10,000 sec period => max of 10,000/sec. Min rate is then 429490 |
8 | seconds, or one every 59 hours. */ | 10 | seconds, or one every 59 hours. */ |
9 | struct xt_rateinfo { | 11 | struct xt_rateinfo { |
@@ -11,11 +13,10 @@ struct xt_rateinfo { | |||
11 | u_int32_t burst; /* Period multiplier for upper limit. */ | 13 | u_int32_t burst; /* Period multiplier for upper limit. */ |
12 | 14 | ||
13 | /* Used internally by the kernel */ | 15 | /* Used internally by the kernel */ |
14 | unsigned long prev; | 16 | unsigned long prev; /* moved to xt_limit_priv */ |
15 | u_int32_t credit; | 17 | u_int32_t credit; /* moved to xt_limit_priv */ |
16 | u_int32_t credit_cap, cost; | 18 | u_int32_t credit_cap, cost; |
17 | 19 | ||
18 | /* Ugly, ugly fucker. */ | 20 | struct xt_limit_priv *master; |
19 | struct xt_rateinfo *master; | ||
20 | }; | 21 | }; |
21 | #endif /*_XT_RATE_H*/ | 22 | #endif /*_XT_RATE_H*/ |
diff --git a/include/linux/netfilter/xt_quota.h b/include/linux/netfilter/xt_quota.h index 4c8368d781e5..8dc89dfc1361 100644 --- a/include/linux/netfilter/xt_quota.h +++ b/include/linux/netfilter/xt_quota.h | |||
@@ -6,13 +6,15 @@ enum xt_quota_flags { | |||
6 | }; | 6 | }; |
7 | #define XT_QUOTA_MASK 0x1 | 7 | #define XT_QUOTA_MASK 0x1 |
8 | 8 | ||
9 | struct xt_quota_priv; | ||
10 | |||
9 | struct xt_quota_info { | 11 | struct xt_quota_info { |
10 | u_int32_t flags; | 12 | u_int32_t flags; |
11 | u_int32_t pad; | 13 | u_int32_t pad; |
12 | 14 | ||
13 | /* Used internally by the kernel */ | 15 | /* Used internally by the kernel */ |
14 | aligned_u64 quota; | 16 | aligned_u64 quota; |
15 | struct xt_quota_info *master; | 17 | struct xt_quota_priv *master; |
16 | }; | 18 | }; |
17 | 19 | ||
18 | #endif /* _XT_QUOTA_H */ | 20 | #endif /* _XT_QUOTA_H */ |
diff --git a/include/linux/netfilter/xt_statistic.h b/include/linux/netfilter/xt_statistic.h index 3d38bc975048..8f521ab49ef7 100644 --- a/include/linux/netfilter/xt_statistic.h +++ b/include/linux/netfilter/xt_statistic.h | |||
@@ -13,6 +13,8 @@ enum xt_statistic_flags { | |||
13 | }; | 13 | }; |
14 | #define XT_STATISTIC_MASK 0x1 | 14 | #define XT_STATISTIC_MASK 0x1 |
15 | 15 | ||
16 | struct xt_statistic_priv; | ||
17 | |||
16 | struct xt_statistic_info { | 18 | struct xt_statistic_info { |
17 | u_int16_t mode; | 19 | u_int16_t mode; |
18 | u_int16_t flags; | 20 | u_int16_t flags; |
@@ -23,11 +25,10 @@ struct xt_statistic_info { | |||
23 | struct { | 25 | struct { |
24 | u_int32_t every; | 26 | u_int32_t every; |
25 | u_int32_t packet; | 27 | u_int32_t packet; |
26 | /* Used internally by the kernel */ | 28 | u_int32_t count; /* unused */ |
27 | u_int32_t count; | ||
28 | } nth; | 29 | } nth; |
29 | } u; | 30 | } u; |
30 | struct xt_statistic_info *master __attribute__((aligned(8))); | 31 | struct xt_statistic_priv *master __attribute__((aligned(8))); |
31 | }; | 32 | }; |
32 | 33 | ||
33 | #endif /* _XT_STATISTIC_H */ | 34 | #endif /* _XT_STATISTIC_H */ |