Refactor to explicitly set pointer to NULL after free to avoid double free.
Signed-off-by: Hernan Vargas <hernan.var...@intel.com> --- drivers/baseband/acc/rte_acc100_pmd.c | 23 +++++++------ drivers/baseband/acc/rte_vrb_pmd.c | 48 +++++++++++++++------------ 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/drivers/baseband/acc/rte_acc100_pmd.c b/drivers/baseband/acc/rte_acc100_pmd.c index c82a0b6cc174..d33e42c8070b 100644 --- a/drivers/baseband/acc/rte_acc100_pmd.c +++ b/drivers/baseband/acc/rte_acc100_pmd.c @@ -564,6 +564,7 @@ acc100_setup_queues(struct rte_bbdev *dev, uint16_t num_queues, int socket_id) d->tail_ptrs = NULL; free_sw_rings: rte_free(d->sw_rings_base); + d->sw_rings_base = NULL; d->sw_rings = NULL; return ret; @@ -593,6 +594,7 @@ acc100_intr_enable(struct rte_bbdev *dev) "Couldn't enable interrupts for device: %s", dev->data->name); rte_free(d->info_ring); + d->info_ring = NULL; return ret; } ret = rte_intr_callback_register(dev->intr_handle, @@ -602,6 +604,7 @@ acc100_intr_enable(struct rte_bbdev *dev) "Couldn't register interrupt callback for device: %s", dev->data->name); rte_free(d->info_ring); + d->info_ring = NULL; return ret; } @@ -619,16 +622,15 @@ acc100_dev_close(struct rte_bbdev *dev) { struct acc_device *d = dev->data->dev_private; acc100_check_ir(d); - if (d->sw_rings_base != NULL) { - rte_free(d->tail_ptrs); - rte_free(d->info_ring); - rte_free(d->sw_rings_base); - rte_free(d->harq_layout); - d->sw_rings_base = NULL; - d->tail_ptrs = NULL; - d->info_ring = NULL; - d->harq_layout = NULL; - } + rte_free(d->tail_ptrs); + rte_free(d->info_ring); + rte_free(d->sw_rings_base); + rte_free(d->harq_layout); + d->tail_ptrs = NULL; + d->info_ring = NULL; + d->sw_rings_base = NULL; + d->sw_rings = NULL; + d->harq_layout = NULL; /* Ensure all in flight HW transactions are completed */ usleep(ACC_LONG_WAIT); return 0; @@ -4235,6 +4237,7 @@ poweron_cleanup(struct rte_bbdev *bbdev, struct acc_device *d, rte_bbdev_log(INFO, "Number of 5GUL engines %d", numEngines); rte_free(d->sw_rings_base); + d->sw_rings_base = NULL; usleep(ACC_LONG_WAIT); } diff --git a/drivers/baseband/acc/rte_vrb_pmd.c b/drivers/baseband/acc/rte_vrb_pmd.c index c0464d20c641..03df270af1cf 100644 --- a/drivers/baseband/acc/rte_vrb_pmd.c +++ b/drivers/baseband/acc/rte_vrb_pmd.c @@ -745,10 +745,13 @@ vrb_setup_queues(struct rte_bbdev *dev, uint16_t num_queues, int socket_id) free_sw_rings: if (d->device_variant == VRB1_VARIANT) { rte_free(d->sw_rings_base); + d->sw_rings_base = NULL; d->sw_rings = NULL; } else if (d->device_variant == VRB2_VARIANT) { - for (i = 0; i <= RTE_BBDEV_OP_MLDTS; i++) + for (i = 0; i <= RTE_BBDEV_OP_MLDTS; i++) { rte_free(d->sw_rings_array[i]); + d->sw_rings_array[i] = 0; + } } return ret; @@ -786,6 +789,7 @@ vrb_intr_enable(struct rte_bbdev *dev) "Couldn't enable interrupts for device: %s", dev->data->name); rte_free(d->info_ring); + d->info_ring = NULL; return ret; } ret = rte_intr_callback_register(dev->intr_handle, @@ -795,6 +799,7 @@ vrb_intr_enable(struct rte_bbdev *dev) "Couldn't register interrupt callback for device: %s", dev->data->name); rte_free(d->info_ring); + d->info_ring = NULL; return ret; } @@ -849,6 +854,7 @@ vrb_intr_enable(struct rte_bbdev *dev) "Couldn't enable interrupts for device: %s", dev->data->name); rte_free(d->info_ring); + d->info_ring = NULL; return ret; } ret = rte_intr_callback_register(dev->intr_handle, @@ -858,6 +864,7 @@ vrb_intr_enable(struct rte_bbdev *dev) "Couldn't register interrupt callback for device: %s", dev->data->name); rte_free(d->info_ring); + d->info_ring = NULL; return ret; } @@ -878,28 +885,25 @@ vrb_dev_close(struct rte_bbdev *dev) vrb_check_ir(d); if (d->device_variant == VRB1_VARIANT) { - if (d->sw_rings_base != NULL) { - rte_free(d->tail_ptrs); - rte_free(d->info_ring); - rte_free(d->sw_rings_base); - rte_free(d->harq_layout); - d->tail_ptrs = NULL; - d->info_ring = NULL; - d->sw_rings_base = NULL; - d->harq_layout = NULL; - } + rte_free(d->tail_ptrs); + rte_free(d->info_ring); + rte_free(d->sw_rings_base); + rte_free(d->harq_layout); + d->tail_ptrs = NULL; + d->info_ring = NULL; + d->sw_rings_base = NULL; + d->sw_rings = NULL; + d->harq_layout = NULL; } else if (d->device_variant == VRB2_VARIANT) { - if (d->sw_rings_array[1] != NULL) { - rte_free(d->tail_ptrs); - rte_free(d->info_ring); - rte_free(d->harq_layout); - d->tail_ptrs = NULL; - d->info_ring = NULL; - d->harq_layout = NULL; - for (i = 0; i <= RTE_BBDEV_OP_MLDTS; i++) { - rte_free(d->sw_rings_array[i]); - d->sw_rings_array[i] = NULL; - } + rte_free(d->tail_ptrs); + rte_free(d->info_ring); + rte_free(d->harq_layout); + d->tail_ptrs = NULL; + d->info_ring = NULL; + d->harq_layout = NULL; + for (i = 0; i <= RTE_BBDEV_OP_MLDTS; i++) { + rte_free(d->sw_rings_array[i]); + d->sw_rings_array[i] = NULL; } } /* Ensure all in flight HW transactions are completed. */ -- 2.37.1