From 3df951337441cc6b7bb99996e0acf185d4aa52c5 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Mon, 9 Mar 2020 03:00:25 -0700 Subject: [PATCH] contigmem: cleanup properly when load fails If contigmem is not able to allocate all of the requested buffers, it frees whatever buffers were able to be allocated up until that point. But the pointers are not set to NULL in that case. After the load fails, the FreeBSD kernel will immediately call the contigmem unload handler, which tries to free the buffers again since the pointers were not set to NULL. It's not clear that we should just rely on the unload handler getting called after load failure. So let's keep the existing cleanup code in the load handler, but explicitly set the pointers to NULL after freeing them. Fixes: 5f51eca22489 ("contigmem: free allocated memory on error") Cc: stable@dpdk.org Signed-off-by: Jim Harris Acked-by: Bruce Richardson --- kernel/freebsd/contigmem/contigmem.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kernel/freebsd/contigmem/contigmem.c b/kernel/freebsd/contigmem/contigmem.c index 7ea0bc6177..bd72f4d620 100644 --- a/kernel/freebsd/contigmem/contigmem.c +++ b/kernel/freebsd/contigmem/contigmem.c @@ -165,9 +165,11 @@ contigmem_load() error: for (i = 0; i < contigmem_num_buffers; i++) { - if (contigmem_buffers[i].addr != NULL) + if (contigmem_buffers[i].addr != NULL) { contigfree(contigmem_buffers[i].addr, contigmem_buffer_size, M_CONTIGMEM); + contigmem_buffers[i].addr = NULL; + } if (mtx_initialized(&contigmem_buffers[i].mtx)) mtx_destroy(&contigmem_buffers[i].mtx); } -- 2.20.1