pool: don't call Cleanup after failed Init

Stream reassembly memcap is regulated by the Init and Cleanup
callbacks. If Init fails due to memcap reached, Cleanup had no
way of knowing and it would decrease the memcap even if it hadn't
been increased by Init. This could lead to too much memory use and
memcap counter underflow.

This patch fixes the issue by not calling Cleanup in this case. It's
fair to see a failed Init the responsibility of Init.
pull/3898/head
Victor Julien 6 years ago
parent 597ff3c8e3
commit 9ea6db3889

@ -171,8 +171,6 @@ Pool *PoolInit(uint32_t size, uint32_t prealloc_size, uint32_t elt_size,
}
if (p->Init(pb->data, p->InitData) != 1) {
SCLogError(SC_ERR_POOL_INIT, "init error");
if (p->Cleanup)
p->Cleanup(pb->data);
if (p->Free)
p->Free(pb->data);
else
@ -195,8 +193,6 @@ Pool *PoolInit(uint32_t size, uint32_t prealloc_size, uint32_t elt_size,
pb->data = (char *)p->data_buffer + u32 * elt_size;
if (p->Init(pb->data, p->InitData) != 1) {
SCLogError(SC_ERR_POOL_INIT, "init error");
if (p->Cleanup)
p->Cleanup(pb->data);
pb->data = NULL;
goto error;
}
@ -303,8 +299,6 @@ void *PoolGet(Pool *p)
if (pitem != NULL) {
if (p->Init(pitem, p->InitData) != 1) {
if (p->Cleanup)
p->Cleanup(pitem);
if (p->Free != NULL)
p->Free(pitem);
else

Loading…
Cancel
Save