mem-pool: Reject the creation of unintentionally empty pools
If a base address is configured, we don't expect the pool to be empty, so reject the creation (e.g. with the broadcast address as base). References strongswan/strongswan#2205
This commit is contained in:
@@ -702,6 +702,13 @@ mem_pool_t *mem_pool_create(char *name, host_t *base, int bits)
|
|||||||
{ /* only serve the second address of the subnet */
|
{ /* only serve the second address of the subnet */
|
||||||
this->size--;
|
this->size--;
|
||||||
}
|
}
|
||||||
|
if (!this->size)
|
||||||
|
{
|
||||||
|
DBG1(DBG_CFG, "virtual IP pool %H/%d is empty",
|
||||||
|
base, addr_bits - bits);
|
||||||
|
destroy(this);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return &this->public;
|
return &this->public;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -286,11 +286,20 @@ static void load_addrs(private_load_tester_config_t *this)
|
|||||||
from = host_create_from_subnet(token, &bits);
|
from = host_create_from_subnet(token, &bits);
|
||||||
if (from)
|
if (from)
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "loaded load-tester address pool %H/%d on %s",
|
|
||||||
from, bits, iface);
|
|
||||||
pool = mem_pool_create(iface, from, bits);
|
pool = mem_pool_create(iface, from, bits);
|
||||||
|
if (pool)
|
||||||
|
{
|
||||||
|
DBG1(DBG_CFG, "loaded load-tester address pool %H/%d "
|
||||||
|
"on %s", from, bits, iface);
|
||||||
|
this->pools->insert_last(this->pools, pool);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
DBG1(DBG_CFG, "invalid load-tester address pool %H/%d "
|
||||||
|
"on %s, skipped", from, bits, iface);
|
||||||
|
}
|
||||||
from->destroy(from);
|
from->destroy(from);
|
||||||
this->pools->insert_last(this->pools, pool);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -153,13 +153,10 @@ START_TEST(test_cidr_offset)
|
|||||||
pool->destroy(pool);
|
pool->destroy(pool);
|
||||||
base->destroy(base);
|
base->destroy(base);
|
||||||
|
|
||||||
/* due to size == 0 we get the requested IP back */
|
/* this results in an empty pool, which is rejected */
|
||||||
base = host_create_from_string("192.168.0.255", 0);
|
base = host_create_from_string("192.168.0.255", 0);
|
||||||
pool = mem_pool_create("test", base, 24);
|
pool = mem_pool_create("test", base, 24);
|
||||||
ck_assert_int_eq(0, pool->get_size(pool));
|
ck_assert(!pool);
|
||||||
assert_acquire(pool, "192.168.0.1", "192.168.0.1", MEM_POOL_NEW);
|
|
||||||
pool->destroy(pool);
|
|
||||||
|
|
||||||
base->destroy(base);
|
base->destroy(base);
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|||||||
Reference in New Issue
Block a user