diff options
-rw-r--r-- | net/ipv4/inet_diag.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 529747d07a2a..95f1a458371d 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
@@ -432,25 +432,31 @@ static int inet_diag_bc_run(const struct nlattr *_bc, | |||
432 | break; | 432 | break; |
433 | } | 433 | } |
434 | 434 | ||
435 | if (cond->prefix_len == 0) | ||
436 | break; | ||
437 | |||
438 | if (op->code == INET_DIAG_BC_S_COND) | 435 | if (op->code == INET_DIAG_BC_S_COND) |
439 | addr = entry->saddr; | 436 | addr = entry->saddr; |
440 | else | 437 | else |
441 | addr = entry->daddr; | 438 | addr = entry->daddr; |
442 | 439 | ||
440 | if (cond->family != AF_UNSPEC && | ||
441 | cond->family != entry->family) { | ||
442 | if (entry->family == AF_INET6 && | ||
443 | cond->family == AF_INET) { | ||
444 | if (addr[0] == 0 && addr[1] == 0 && | ||
445 | addr[2] == htonl(0xffff) && | ||
446 | bitstring_match(addr + 3, | ||
447 | cond->addr, | ||
448 | cond->prefix_len)) | ||
449 | break; | ||
450 | } | ||
451 | yes = 0; | ||
452 | break; | ||
453 | } | ||
454 | |||
455 | if (cond->prefix_len == 0) | ||
456 | break; | ||
443 | if (bitstring_match(addr, cond->addr, | 457 | if (bitstring_match(addr, cond->addr, |
444 | cond->prefix_len)) | 458 | cond->prefix_len)) |
445 | break; | 459 | break; |
446 | if (entry->family == AF_INET6 && | ||
447 | cond->family == AF_INET) { | ||
448 | if (addr[0] == 0 && addr[1] == 0 && | ||
449 | addr[2] == htonl(0xffff) && | ||
450 | bitstring_match(addr + 3, cond->addr, | ||
451 | cond->prefix_len)) | ||
452 | break; | ||
453 | } | ||
454 | yes = 0; | 460 | yes = 0; |
455 | break; | 461 | break; |
456 | } | 462 | } |