mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-21 04:31:26 +00:00
scst_mem: Allow NULL 'pool' pointer in sgv_pool_destroy()
sgv_pool_destroy() does not tolerate a NULL sgv_pool pointer argument and
performs a NULL-pointer dereference. This requires additional attention
and effort from developers/reviewers and forces all sgv_pool_destroy()
callers to do a NULL check
if (pool)
sgv_pool_destroy(pool);
Or, otherwise, be invalid sgv_pool_destroy() users.
Tweak sgv_pool_destroy() and NULL-check the pointer there.
This commit is contained in:
@@ -1519,6 +1519,9 @@ static void sgv_pool_destroy(struct sgv_pool *pool)
|
||||
|
||||
TRACE_ENTRY();
|
||||
|
||||
if (unlikely(!pool))
|
||||
goto out;
|
||||
|
||||
sgv_pool_flush(pool);
|
||||
|
||||
mutex_lock(&sgv_pools_mutex);
|
||||
@@ -1540,6 +1543,7 @@ static void sgv_pool_destroy(struct sgv_pool *pool)
|
||||
|
||||
kmem_cache_free(sgv_pool_cachep, pool);
|
||||
|
||||
out:
|
||||
TRACE_EXIT();
|
||||
return;
|
||||
}
|
||||
@@ -1802,18 +1806,15 @@ out:
|
||||
|
||||
out_free_per_cpu_dma:
|
||||
for (i = 0; i < nr_cpu_ids; i++)
|
||||
if (sgv_dma_pool_per_cpu[i] != NULL)
|
||||
sgv_pool_destroy(sgv_dma_pool_per_cpu[i]);
|
||||
sgv_pool_destroy(sgv_dma_pool_per_cpu[i]);
|
||||
|
||||
out_free_per_cpu_clust:
|
||||
for (i = 0; i < nr_cpu_ids; i++)
|
||||
if (sgv_norm_clust_pool_per_cpu[i] != NULL)
|
||||
sgv_pool_destroy(sgv_norm_clust_pool_per_cpu[i]);
|
||||
sgv_pool_destroy(sgv_norm_clust_pool_per_cpu[i]);
|
||||
|
||||
out_free_per_cpu_norm:
|
||||
for (i = 0; i < nr_cpu_ids; i++)
|
||||
if (sgv_norm_pool_per_cpu[i] != NULL)
|
||||
sgv_pool_destroy(sgv_norm_pool_per_cpu[i]);
|
||||
sgv_pool_destroy(sgv_norm_pool_per_cpu[i]);
|
||||
|
||||
sgv_pool_destroy(sgv_dma_pool_main);
|
||||
|
||||
@@ -1841,18 +1842,15 @@ void scst_sgv_pools_deinit(void)
|
||||
|
||||
sgv_pool_destroy(sgv_dma_pool_main);
|
||||
for (i = 0; i < nr_cpu_ids; i++)
|
||||
if (sgv_dma_pool_per_cpu[i] != NULL)
|
||||
sgv_pool_destroy(sgv_dma_pool_per_cpu[i]);
|
||||
sgv_pool_destroy(sgv_dma_pool_per_cpu[i]);
|
||||
|
||||
sgv_pool_destroy(sgv_norm_pool_main);
|
||||
for (i = 0; i < nr_cpu_ids; i++)
|
||||
if (sgv_norm_pool_per_cpu[i] != NULL)
|
||||
sgv_pool_destroy(sgv_norm_pool_per_cpu[i]);
|
||||
sgv_pool_destroy(sgv_norm_pool_per_cpu[i]);
|
||||
|
||||
sgv_pool_destroy(sgv_norm_clust_pool_main);
|
||||
for (i = 0; i < nr_cpu_ids; i++)
|
||||
if (sgv_norm_clust_pool_per_cpu[i] != NULL)
|
||||
sgv_pool_destroy(sgv_norm_clust_pool_per_cpu[i]);
|
||||
sgv_pool_destroy(sgv_norm_clust_pool_per_cpu[i]);
|
||||
|
||||
for (i = 0; i < nr_cpu_ids; i++)
|
||||
sgv_norm_pool_global[i] = NULL;
|
||||
|
||||
Reference in New Issue
Block a user