Patrick McHardy wrote:
> Dmitry Mishin wrote:
>
>>It's better, but I see the issue with iterate with compat_check_entry() calls.
>>If it fails, some of target/matches' check_* functions are called, some not.
>>Please, review my version of this patch.
>
>
>
> You're right again, thanks. Patch applied.
>
With one minor change:
diff --git a/include/linux/netfilter_ipv4/ip_tables.h
b/include/linux/netfilter_ipv4/ip_tables.h
index 9c294a5..e992cd6 100644
--- a/include/linux/netfilter_ipv4/ip_tables.h
+++ b/include/linux/netfilter_ipv4/ip_tables.h
@@ -265,14 +265,17 @@ ipt_get_target(struct ipt_entry *e)
})
/* fn returns 0 to continue iteration */
-#define IPT_ENTRY_ITERATE_CONTINUE(entries, size, i, fn, args...) \
+#define IPT_ENTRY_ITERATE_CONTINUE(entries, size, n, fn, args...) \
({ \
- unsigned int __i; \
+ unsigned int __i, __n; \
int __ret = 0; \
struct ipt_entry *__entry; \
\
- for (__i = i; __i < (size); __i += __entry->next_offset) { \
+ for (__i = 0, __n = 0; __i < (size); \
+ __i += __entry->next_offset, __n++) { \
__entry = (void *)(entries) + __i; \
+ if (__n < n) \
+ continue; \
\
__ret = fn(__entry , ## args); \
if (__ret != 0) \