|
@@ -2060,7 +2060,9 @@ static int ebt_size_mwt(struct compat_ebt_entry_mwt *match32,
|
|
|
if (match_kern)
|
|
|
match_kern->match_size = ret;
|
|
|
|
|
|
- WARN_ON(type == EBT_COMPAT_TARGET && size_left);
|
|
|
+ if (WARN_ON(type == EBT_COMPAT_TARGET && size_left))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
match32 = (struct compat_ebt_entry_mwt *) buf;
|
|
|
}
|
|
|
|
|
@@ -2116,6 +2118,15 @@ static int size_entry_mwt(struct ebt_entry *entry, const unsigned char *base,
|
|
|
*
|
|
|
* offsets are relative to beginning of struct ebt_entry (i.e., 0).
|
|
|
*/
|
|
|
+ for (i = 0; i < 4 ; ++i) {
|
|
|
+ if (offsets[i] >= *total)
|
|
|
+ return -EINVAL;
|
|
|
+ if (i == 0)
|
|
|
+ continue;
|
|
|
+ if (offsets[i-1] > offsets[i])
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
for (i = 0, j = 1 ; j < 4 ; j++, i++) {
|
|
|
struct compat_ebt_entry_mwt *match32;
|
|
|
unsigned int size;
|