|
@@ -411,6 +411,12 @@ ebt_check_watcher(struct ebt_entry_watcher *w, struct xt_tgchk_param *par,
|
|
|
watcher = xt_request_find_target(NFPROTO_BRIDGE, w->u.name, 0);
|
|
|
if (IS_ERR(watcher))
|
|
|
return PTR_ERR(watcher);
|
|
|
+
|
|
|
+ if (watcher->family != NFPROTO_BRIDGE) {
|
|
|
+ module_put(watcher->me);
|
|
|
+ return -ENOENT;
|
|
|
+ }
|
|
|
+
|
|
|
w->u.watcher = watcher;
|
|
|
|
|
|
par->target = watcher;
|
|
@@ -709,6 +715,8 @@ ebt_check_entry(struct ebt_entry *e, struct net *net,
|
|
|
}
|
|
|
i = 0;
|
|
|
|
|
|
+ memset(&mtpar, 0, sizeof(mtpar));
|
|
|
+ memset(&tgpar, 0, sizeof(tgpar));
|
|
|
mtpar.net = tgpar.net = net;
|
|
|
mtpar.table = tgpar.table = name;
|
|
|
mtpar.entryinfo = tgpar.entryinfo = e;
|
|
@@ -730,6 +738,13 @@ ebt_check_entry(struct ebt_entry *e, struct net *net,
|
|
|
goto cleanup_watchers;
|
|
|
}
|
|
|
|
|
|
+ /* Reject UNSPEC, xtables verdicts/return values are incompatible */
|
|
|
+ if (target->family != NFPROTO_BRIDGE) {
|
|
|
+ module_put(target->me);
|
|
|
+ ret = -ENOENT;
|
|
|
+ goto cleanup_watchers;
|
|
|
+ }
|
|
|
+
|
|
|
t->u.target = target;
|
|
|
if (t->u.target == &ebt_standard_target) {
|
|
|
if (gap < sizeof(struct ebt_standard_target)) {
|
|
@@ -1605,16 +1620,16 @@ struct compat_ebt_entry_mwt {
|
|
|
compat_uptr_t ptr;
|
|
|
} u;
|
|
|
compat_uint_t match_size;
|
|
|
- compat_uint_t data[0];
|
|
|
+ compat_uint_t data[0] __attribute__ ((aligned (__alignof__(struct compat_ebt_replace))));
|
|
|
};
|
|
|
|
|
|
/* account for possible padding between match_size and ->data */
|
|
|
static int ebt_compat_entry_padsize(void)
|
|
|
{
|
|
|
- BUILD_BUG_ON(XT_ALIGN(sizeof(struct ebt_entry_match)) <
|
|
|
- COMPAT_XT_ALIGN(sizeof(struct compat_ebt_entry_mwt)));
|
|
|
- return (int) XT_ALIGN(sizeof(struct ebt_entry_match)) -
|
|
|
- COMPAT_XT_ALIGN(sizeof(struct compat_ebt_entry_mwt));
|
|
|
+ BUILD_BUG_ON(sizeof(struct ebt_entry_match) <
|
|
|
+ sizeof(struct compat_ebt_entry_mwt));
|
|
|
+ return (int) sizeof(struct ebt_entry_match) -
|
|
|
+ sizeof(struct compat_ebt_entry_mwt);
|
|
|
}
|
|
|
|
|
|
static int ebt_compat_match_offset(const struct xt_match *match,
|