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:
Gleb Chesnokov
2022-09-03 15:53:59 +03:00
parent 96f5cfb7b3
commit a13ef3be90

View File

@@ -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;