diff options
| -rw-r--r-- | net/netfilter/ipset/ip_set_hash_gen.h | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h index 57beb1762b2d..707bc520d629 100644 --- a/net/netfilter/ipset/ip_set_hash_gen.h +++ b/net/netfilter/ipset/ip_set_hash_gen.h | |||
| @@ -325,18 +325,22 @@ mtype_add_cidr(struct htype *h, u8 cidr, u8 nets_length) | |||
| 325 | static void | 325 | static void |
| 326 | mtype_del_cidr(struct htype *h, u8 cidr, u8 nets_length) | 326 | mtype_del_cidr(struct htype *h, u8 cidr, u8 nets_length) |
| 327 | { | 327 | { |
| 328 | u8 i, j; | 328 | u8 i, j, net_end = nets_length - 1; |
| 329 | 329 | ||
| 330 | for (i = 0; i < nets_length - 1 && h->nets[i].cidr != cidr; i++) | 330 | for (i = 0; i < nets_length; i++) { |
| 331 | ; | 331 | if (h->nets[i].cidr != cidr) |
| 332 | h->nets[i].nets--; | 332 | continue; |
| 333 | 333 | if (h->nets[i].nets > 1 || i == net_end || | |
| 334 | if (h->nets[i].nets != 0) | 334 | h->nets[i + 1].nets == 0) { |
| 335 | return; | 335 | h->nets[i].nets--; |
| 336 | 336 | return; | |
| 337 | for (j = i; j < nets_length - 1 && h->nets[j].nets; j++) { | 337 | } |
| 338 | h->nets[j].cidr = h->nets[j + 1].cidr; | 338 | for (j = i; j < net_end && h->nets[j].nets; j++) { |
| 339 | h->nets[j].nets = h->nets[j + 1].nets; | 339 | h->nets[j].cidr = h->nets[j + 1].cidr; |
| 340 | h->nets[j].nets = h->nets[j + 1].nets; | ||
| 341 | } | ||
| 342 | h->nets[j].nets = 0; | ||
| 343 | return; | ||
| 340 | } | 344 | } |
| 341 | } | 345 | } |
| 342 | #endif | 346 | #endif |
