eal: free leaked logid storage
PATCH 1/1 eal: free leaked logid storage
Previously, the logid variable would be leaked when the function returned.
--- lib/librte_eal/linuxapp/eal/eal.c | 65 ++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 21 deletions(-)
lib/librte_eal/linuxapp/eal/eal.c +44 -21
@@ -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; }
Signature · 1 line
2.14.3
Quoted 5 lines · Aaron Conole
Previously, the logid variable would be leaked when the function returned.
Signed-off-by Aaron Conole <[email protected]>---
Ugh. Ignore this version. I broke it when I manually rebased.
v2 soon.
PATCH v2 1/1 eal: free leaked storage
In reply to Aaron ConolePreviously, the logid variable would be leaked when the function returned.
--- lib/librte_eal/linuxapp/eal/eal.c | 71 ++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 23 deletions(-)
lib/librte_eal/linuxapp/eal/eal.c +48 -23
@@ -803,6 +803,7 @@ rte_eal_init(int argc, char **argv)int i, fctret, ret;pthread_t thread_id;static rte_atomic32_t run_once =RTE_ATOMIC32_INIT (0 ); +char *logid_storage;const char *logid;char cpuset[RTE_CPU_AFFINITY_STR_LEN ];char thread_name[RTE_MAX_THREAD_NAME_LEN ];
@@ -820,8 +821,9 @@ rte_eal_init(int argc, char **argv)return -1 ; } - logid =strrchr (argv[0 ],'/' ); - logid =strdup (logid ? logid +1 : argv[0 ]); + logid_storage =strrchr (argv[0 ],'/' ); + logid_storage =strdup (logid_storage ? logid_storage +1 : argv[0 ]); + logid = logid_storage; thread_id =pthread_self ();
@@ -833,7 +835,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 +844,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 +878,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 +887,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 +912,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 +939,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 +948,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 +959,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 +976,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 +1052,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 +1078,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_storage);return fctret; }
Signature · 1 line
2.14.3
Re: [PATCH v2] eal: free leaked storage
22/07/2018 13:16, Aaron Conole:
Quoted 4 lines
Previously, the logid variable would be leaked when the function returned.
Signed-off-by Aaron Conole <[email protected]>
I am not confortable to merge this kind of patch in RC3. OK to wait 18.11?
Re: [PATCH v2] eal: free leaked storage
Quoted 8 lines · Thomas Monjalon
22/07/2018 13:16, Aaron Conole:
Quoted 4 lines
Previously, the logid variable would be leaked when the function returned.
Signed-off-by Aaron Conole <[email protected]>I am not confortable to merge this kind of patch in RC3. OK to wait 18.11?
Sure - please don't forget it, because I probably won't.
Re: [PATCH v2] eal: free leaked storage
01/08/2018 18:51, Aaron Conole:
Quoted 6 lines
Quoted 4 lines · Thomas Monjalon
22/07/2018 13:16, Aaron Conole:
Quoted 3 lines
Previously, the logid variable would be leaked when the function returned.
Quoted 6 lines
Quoted 4 lines
Quoted 1 line
Signed-off-by Aaron Conole <[email protected]>I am not confortable to merge this kind of patch in RC3. OK to wait 18.11?
Sure - please don't forget it, because I probably won't.
I forgot :(
Now we have a shorter patch:
https://patches.dpdk.org/patch/44605/
which supersedes this one.