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 | } |
