Previously, the logid variable would be leaked when the function returned. Signed-off-by: Aaron Conole <acon...@redhat.com> --- lib/librte_eal/linuxapp/eal/eal.c | 65 ++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 21 deletions(-)
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index d2d5aae80..3208e7079 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -833,7 +833,8 @@ rte_eal_init(int argc, char **argv) if (rte_eal_cpu_init() < 0) { rte_eal_init_alert("Cannot detect lcores."); rte_errno = ENOTSUP; - return -1; + fctret = -1; + goto finished; } fctret = eal_parse_args(argc, argv); @@ -841,27 +842,31 @@ rte_eal_init(int argc, char **argv) rte_eal_init_alert("Invalid 'command line' arguments."); rte_errno = EINVAL; rte_atomic32_clear(&run_once); - return -1; + fctret = -1; + goto finished; } if (eal_plugins_init() < 0) { rte_eal_init_alert("Cannot init plugins\n"); rte_errno = EINVAL; rte_atomic32_clear(&run_once); - return -1; + fctret = -1; + goto finished; } if (eal_option_device_parse()) { rte_errno = ENODEV; rte_atomic32_clear(&run_once); - return -1; + fctret = -1; + goto finished; } rte_config_init(); if (rte_eal_intr_init() < 0) { rte_eal_init_alert("Cannot init interrupt-handling thread\n"); - return -1; + fctret = -1; + goto finished; } /* Put mp channel init before bus scan so that we can init the vdev @@ -871,7 +876,8 @@ rte_eal_init(int argc, char **argv) rte_eal_init_alert("failed to init mp channel\n"); if (rte_eal_process_type() == RTE_PROC_PRIMARY) { rte_errno = EFAULT; - return -1; + fctret = -1; + goto finished; } } @@ -879,7 +885,8 @@ rte_eal_init(int argc, char **argv) rte_eal_init_alert("Cannot scan the buses for devices\n"); rte_errno = ENODEV; rte_atomic32_clear(&run_once); - return -1; + fctret = -1; + goto finished; } /* autodetect the iova mapping mode (default is iova_pa) */ @@ -903,7 +910,8 @@ rte_eal_init(int argc, char **argv) rte_eal_init_alert("Cannot get hugepage information."); rte_errno = EACCES; rte_atomic32_clear(&run_once); - return -1; + fctret = -1; + goto finished; } } @@ -929,7 +937,8 @@ rte_eal_init(int argc, char **argv) rte_eal_init_alert("Cannot init logging."); rte_errno = ENOMEM; rte_atomic32_clear(&run_once); - return -1; + fctret = -1; + goto finished; } #ifdef VFIO_PRESENT @@ -937,7 +946,8 @@ rte_eal_init(int argc, char **argv) rte_eal_init_alert("Cannot init VFIO\n"); rte_errno = EAGAIN; rte_atomic32_clear(&run_once); - return -1; + fctret = -1; + goto finished; } #endif /* in secondary processes, memory init may allocate additional fbarrays @@ -947,13 +957,15 @@ rte_eal_init(int argc, char **argv) if (rte_eal_memzone_init() < 0) { rte_eal_init_alert("Cannot init memzone\n"); rte_errno = ENODEV; - return -1; + fctret = -1; + goto finished; } if (rte_eal_memory_init() < 0) { rte_eal_init_alert("Cannot init memory\n"); rte_errno = ENOMEM; - return -1; + fctret = -1; + goto finished; } /* the directories are locked during eal_hugepage_info_init */ @@ -962,25 +974,29 @@ rte_eal_init(int argc, char **argv) if (rte_eal_malloc_heap_init() < 0) { rte_eal_init_alert("Cannot init malloc heap\n"); rte_errno = ENODEV; - return -1; + fctret = -1; + goto finished; } if (rte_eal_tailqs_init() < 0) { rte_eal_init_alert("Cannot init tail queues for objects\n"); rte_errno = EFAULT; - return -1; + fctret = -1; + goto finished; } if (rte_eal_alarm_init() < 0) { rte_eal_init_alert("Cannot init interrupt-handling thread\n"); /* rte_eal_alarm_init sets rte_errno on failure. */ - return -1; + fctret = -1; + goto finished; } if (rte_eal_timer_init() < 0) { rte_eal_init_alert("Cannot init HPET or TSC timers\n"); rte_errno = ENOTSUP; - return -1; + fctret = -1; + goto finished; } eal_check_mem_on_local_socket(); @@ -1034,20 +1050,24 @@ rte_eal_init(int argc, char **argv) if (ret) { rte_eal_init_alert("rte_service_init() failed\n"); rte_errno = ENOEXEC; - return -1; + fctret = -1; + goto finished; } /* Probe all the buses and devices/drivers on them */ if (rte_bus_probe()) { rte_eal_init_alert("Cannot probe devices\n"); rte_errno = ENOTSUP; - return -1; + fctret = -1; + goto finished; } #ifdef VFIO_PRESENT /* Register mp action after probe() so that we got enough info */ - if (rte_vfio_is_enabled("vfio") && vfio_mp_sync_setup() < 0) - return -1; + if (rte_vfio_is_enabled("vfio") && vfio_mp_sync_setup() < 0) { + fctret = -1; + goto finished; + } #endif /* initialize default service/lcore mappings and start running. Ignore @@ -1056,11 +1076,14 @@ rte_eal_init(int argc, char **argv) ret = rte_service_start_with_defaults(); if (ret < 0 && ret != -ENOTSUP) { rte_errno = ENOEXEC; - return -1; + fctret = -1; + goto finished; } rte_eal_mcfg_complete(); +finished: + free(logid); return fctret; } -- 2.14.3