aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
authorJan Engelhardt <jengelh@medozas.de>2009-07-18 08:52:58 -0400
committerJan Engelhardt <jengelh@medozas.de>2009-08-10 07:35:28 -0400
commita7d51738e757c1ab94595e7d05594c61f0fb32ce (patch)
treeaf862be9cb71bf2ef66cd7fb72ed582428ccbc1d /net/ipv6
parent47901dc2c4a3f1f9af453486a005d31fe9b393f0 (diff)
netfilter: xtables: ignore unassigned hooks in check_entry_size_and_hooks
The "hook_entry" and "underflow" array contains values even for hooks not provided, such as PREROUTING in conjunction with the "filter" table. Usually, the values point to whatever the next rule is. For the upcoming unconditionality and underflow checking patches however, we must not inspect that arbitrary rule. Skipping unassigned hooks seems like a good idea, also because newinfo->hook_entry and newinfo->underflow will then continue to have the poison value for detecting abnormalities. Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
Diffstat (limited to 'net/ipv6')
-rw-r--r--net/ipv6/netfilter/ip6_tables.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
index 1389ad904bc3..8e4921a937ff 100644
--- a/net/ipv6/netfilter/ip6_tables.c
+++ b/net/ipv6/netfilter/ip6_tables.c
@@ -747,6 +747,7 @@ check_entry_size_and_hooks(struct ip6t_entry *e,
747 unsigned char *limit, 747 unsigned char *limit,
748 const unsigned int *hook_entries, 748 const unsigned int *hook_entries,
749 const unsigned int *underflows, 749 const unsigned int *underflows,
750 unsigned int valid_hooks,
750 unsigned int *i) 751 unsigned int *i)
751{ 752{
752 unsigned int h; 753 unsigned int h;
@@ -766,6 +767,8 @@ check_entry_size_and_hooks(struct ip6t_entry *e,
766 767
767 /* Check hooks & underflows */ 768 /* Check hooks & underflows */
768 for (h = 0; h < NF_INET_NUMHOOKS; h++) { 769 for (h = 0; h < NF_INET_NUMHOOKS; h++) {
770 if (!(valid_hooks & (1 << h)))
771 continue;
769 if ((unsigned char *)e - base == hook_entries[h]) 772 if ((unsigned char *)e - base == hook_entries[h])
770 newinfo->hook_entry[h] = hook_entries[h]; 773 newinfo->hook_entry[h] = hook_entries[h];
771 if ((unsigned char *)e - base == underflows[h]) 774 if ((unsigned char *)e - base == underflows[h])
@@ -837,7 +840,7 @@ translate_table(const char *name,
837 newinfo, 840 newinfo,
838 entry0, 841 entry0,
839 entry0 + size, 842 entry0 + size,
840 hook_entries, underflows, &i); 843 hook_entries, underflows, valid_hooks, &i);
841 if (ret != 0) 844 if (ret != 0)
842 return ret; 845 return ret;
843 846