mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 12:16:20 +00:00
netfilter: xt_physdev fixes
1) physdev_mt() incorrectly assumes nulldevname[] is aligned on an int 2) It also uses word comparisons, while it could use long word ones. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: Patrick McHardy <kaber@trash.net>
This commit is contained in:
parent
cfac5ef7b9
commit
4f1c3b7e7e
1 changed files with 11 additions and 12 deletions
|
@ -24,9 +24,9 @@ static bool
|
|||
physdev_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
{
|
||||
int i;
|
||||
static const char nulldevname[IFNAMSIZ];
|
||||
static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long))));
|
||||
const struct xt_physdev_info *info = par->matchinfo;
|
||||
bool ret;
|
||||
unsigned long ret;
|
||||
const char *indev, *outdev;
|
||||
const struct nf_bridge_info *nf_bridge;
|
||||
|
||||
|
@ -68,10 +68,10 @@ physdev_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
|||
if (!(info->bitmask & XT_PHYSDEV_OP_IN))
|
||||
goto match_outdev;
|
||||
indev = nf_bridge->physindev ? nf_bridge->physindev->name : nulldevname;
|
||||
for (i = 0, ret = false; i < IFNAMSIZ/sizeof(unsigned int); i++) {
|
||||
ret |= (((const unsigned int *)indev)[i]
|
||||
^ ((const unsigned int *)info->physindev)[i])
|
||||
& ((const unsigned int *)info->in_mask)[i];
|
||||
for (i = 0, ret = 0; i < IFNAMSIZ/sizeof(unsigned long); i++) {
|
||||
ret |= (((const unsigned long *)indev)[i]
|
||||
^ ((const unsigned long *)info->physindev)[i])
|
||||
& ((const unsigned long *)info->in_mask)[i];
|
||||
}
|
||||
|
||||
if (!ret ^ !(info->invert & XT_PHYSDEV_OP_IN))
|
||||
|
@ -82,13 +82,12 @@ match_outdev:
|
|||
return true;
|
||||
outdev = nf_bridge->physoutdev ?
|
||||
nf_bridge->physoutdev->name : nulldevname;
|
||||
for (i = 0, ret = false; i < IFNAMSIZ/sizeof(unsigned int); i++) {
|
||||
ret |= (((const unsigned int *)outdev)[i]
|
||||
^ ((const unsigned int *)info->physoutdev)[i])
|
||||
& ((const unsigned int *)info->out_mask)[i];
|
||||
for (i = 0, ret = 0; i < IFNAMSIZ/sizeof(unsigned long); i++) {
|
||||
ret |= (((const unsigned long *)outdev)[i]
|
||||
^ ((const unsigned long *)info->physoutdev)[i])
|
||||
& ((const unsigned long *)info->out_mask)[i];
|
||||
}
|
||||
|
||||
return ret ^ !(info->invert & XT_PHYSDEV_OP_OUT);
|
||||
return (!!ret ^ !(info->invert & XT_PHYSDEV_OP_OUT));
|
||||
}
|
||||
|
||||
static bool physdev_mt_check(const struct xt_mtchk_param *par)
|
||||
|
|
Loading…
Reference in a new issue