pending-3.18: 610-netfilter_match_bypass_default_check: fix 32bit compat layer
[openwrt/staging/wigyori.git] / target / linux / generic / pending-3.18 / 610-netfilter_match_bypass_default_checks.patch
index 74be425049eccf6ead1b129b1f4b66433bef225f..e5c7a77b46f21eec882384a38737d1040d662b27 100644 (file)
  
        counters = alloc_counters(table);
        if (IS_ERR(counters))
-@@ -972,6 +1001,14 @@ copy_entries_to_user(unsigned int total_
-                       ret = -EFAULT;
+@@ -973,6 +1002,14 @@ copy_entries_to_user(unsigned int total_
                        goto free_counters;
                }
-+
 +              flags = e->ip.flags & IPT_F_MASK;
 +              if (copy_to_user(userptr + off
 +                               + offsetof(struct ipt_entry, ip.flags),
 +                      ret = -EFAULT;
 +                      goto free_counters;
 +              }
++
                for (i = sizeof(struct ipt_entry);
                     i < e->target_offset;
+                    i += m->u.match_size) {
+@@ -1379,12 +1416,15 @@ compat_copy_entry_to_user(struct ipt_ent
+       compat_uint_t origsize;
+       const struct xt_entry_match *ematch;
+       int ret = 0;
++      u8 flags = e->ip.flags & IPT_F_MASK;
+       origsize = *size;
+       ce = (struct compat_ipt_entry __user *)*dstptr;
+       if (copy_to_user(ce, e, sizeof(struct ipt_entry)) != 0 ||
+           copy_to_user(&ce->counters, &counters[i],
+-          sizeof(counters[i])) != 0)
++          sizeof(counters[i])) != 0 ||
++          copy_to_user(&ce->ip.flags, &flags,
++          sizeof(flags)) != 0)
+               return -EFAULT;
+       *dstptr += sizeof(struct compat_ipt_entry);