diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/netfilter/ip_tables.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 4586af397ef4..cc896fe2fd92 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
@@ -1098,7 +1098,7 @@ static int compat_calc_entry(struct ipt_entry *e, | |||
1098 | unsigned int entry_offset; | 1098 | unsigned int entry_offset; |
1099 | int off, i, ret; | 1099 | int off, i, ret; |
1100 | 1100 | ||
1101 | off = 0; | 1101 | off = sizeof(struct ipt_entry) - sizeof(struct compat_ipt_entry); |
1102 | entry_offset = (void *)e - base; | 1102 | entry_offset = (void *)e - base; |
1103 | IPT_MATCH_ITERATE(e, compat_calc_match, &off); | 1103 | IPT_MATCH_ITERATE(e, compat_calc_match, &off); |
1104 | t = ipt_get_target(e); | 1104 | t = ipt_get_target(e); |
@@ -1501,6 +1501,8 @@ compat_copy_entry_to_user(struct ipt_entry *e, void __user **dstptr, | |||
1501 | goto out; | 1501 | goto out; |
1502 | 1502 | ||
1503 | *dstptr += sizeof(struct compat_ipt_entry); | 1503 | *dstptr += sizeof(struct compat_ipt_entry); |
1504 | *size -= sizeof(struct ipt_entry) - sizeof(struct compat_ipt_entry); | ||
1505 | |||
1504 | ret = IPT_MATCH_ITERATE(e, xt_compat_match_to_user, dstptr, size); | 1506 | ret = IPT_MATCH_ITERATE(e, xt_compat_match_to_user, dstptr, size); |
1505 | target_offset = e->target_offset - (origsize - *size); | 1507 | target_offset = e->target_offset - (origsize - *size); |
1506 | if (ret) | 1508 | if (ret) |
@@ -1605,7 +1607,7 @@ check_compat_entry_size_and_hooks(struct ipt_entry *e, | |||
1605 | if (ret) | 1607 | if (ret) |
1606 | return ret; | 1608 | return ret; |
1607 | 1609 | ||
1608 | off = 0; | 1610 | off = sizeof(struct ipt_entry) - sizeof(struct compat_ipt_entry); |
1609 | entry_offset = (void *)e - (void *)base; | 1611 | entry_offset = (void *)e - (void *)base; |
1610 | j = 0; | 1612 | j = 0; |
1611 | ret = IPT_MATCH_ITERATE(e, compat_find_calc_match, name, &e->ip, | 1613 | ret = IPT_MATCH_ITERATE(e, compat_find_calc_match, name, &e->ip, |
@@ -1671,6 +1673,8 @@ compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr, | |||
1671 | memcpy(de, e, sizeof(struct ipt_entry)); | 1673 | memcpy(de, e, sizeof(struct ipt_entry)); |
1672 | 1674 | ||
1673 | *dstptr += sizeof(struct compat_ipt_entry); | 1675 | *dstptr += sizeof(struct compat_ipt_entry); |
1676 | *size += sizeof(struct ipt_entry) - sizeof(struct compat_ipt_entry); | ||
1677 | |||
1674 | ret = IPT_MATCH_ITERATE(e, xt_compat_match_from_user, dstptr, size); | 1678 | ret = IPT_MATCH_ITERATE(e, xt_compat_match_from_user, dstptr, size); |
1675 | if (ret) | 1679 | if (ret) |
1676 | return ret; | 1680 | return ret; |