From eb2ead11b5b1852569b34f78ad0a91096dfc7f0a Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 15 Feb 2019 01:16:49 +0000 Subject: [PATCH] fix args handling in cmdline class to not be broken first use consistent ownership (stringshare the strings) and then also properly dup and pass them and not free null arrays and so on where they are used --- src/lib/ecore/efl_core_command_line.c | 11 +++++++---- src/lib/ecore/efl_thread.c | 27 +++++++++++++++++---------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/lib/ecore/efl_core_command_line.c b/src/lib/ecore/efl_core_command_line.c index bd6d21f2d4..424dd3486a 100644 --- a/src/lib/ecore/efl_core_command_line.c +++ b/src/lib/ecore/efl_core_command_line.c @@ -180,13 +180,13 @@ _escape(const char *s) return s2; } -EOLIAN static const char* +EOLIAN static const char * _efl_core_command_line_command_get(const Eo *obj EINA_UNUSED, Efl_Core_Command_Line_Data *pd) { - return eina_strdup(pd->string_command); + return pd->string_command; } -EOLIAN static Eina_Accessor* +EOLIAN static Eina_Accessor * _efl_core_command_line_command_access(Eo *obj EINA_UNUSED, Efl_Core_Command_Line_Data *pd) { return pd->command ? eina_array_accessor_new(pd->command) : NULL; @@ -224,7 +224,10 @@ _efl_core_command_line_command_array_set(Eo *obj EINA_UNUSED, Efl_Core_Command_L eina_array_free(pd->command); pd->command = NULL; for (;i < (array ? eina_array_count(array) : 0); ++i) - eina_stringshare_del(content); + { + content = eina_array_data_get(array, i); + eina_stringshare_del(content); + } eina_array_free(array); return EINA_FALSE; } diff --git a/src/lib/ecore/efl_thread.c b/src/lib/ecore/efl_thread.c index 421c92dba7..7e52d7b637 100644 --- a/src/lib/ecore/efl_thread.c +++ b/src/lib/ecore/efl_thread.c @@ -153,19 +153,26 @@ _efl_loop_arguments_send(Eo *obj, void *data EINA_UNUSED, const Eina_Value v) int i = 0; accessor = efl_core_command_line_command_access(obj); - arga = eina_array_new(10); - - EINA_ACCESSOR_FOREACH(accessor, i, argv) + if (accessor) { - eina_array_push(arga, eina_stringshare_add(argv)); + arga = eina_array_new(10); + + EINA_ACCESSOR_FOREACH(accessor, i, argv) + { + eina_array_push(arga, eina_stringshare_add(argv)); + } + arge.argv = arga; } - arge.argv = arga; + else arge.argv = NULL; arge.initialization = EINA_TRUE; efl_event_callback_call(obj, EFL_LOOP_EVENT_ARGUMENTS, &arge); - - while ((s = eina_array_pop(arga))) eina_stringshare_del(s); - eina_array_free(arga); + if (accessor) + { + while ((s = eina_array_pop(arga))) eina_stringshare_del(s); + eina_array_free(arga); + eina_accessor_free(accessor); + } return v; } @@ -276,7 +283,7 @@ _efl_thread_main(void *data, Eina_Thread t) efl_event_callback_priority_add(obj, it->desc, it->priority, it->func, it->user_data); } - efl_core_command_line_command_array_set(obj, thdat->argv); + if (thdat->argv) efl_core_command_line_command_array_set(obj, thdat->argv); thdat->argv = NULL; efl_future_then(obj, efl_loop_job(obj), .success = _efl_loop_arguments_send); @@ -728,7 +735,7 @@ _efl_thread_efl_task_run(Eo *obj, Efl_Thread_Data *pd) acc = efl_core_command_line_command_access(obj); if (acc) { - thdat->argv = eina_array_new(0); + thdat->argv = eina_array_new(1); EINA_ACCESSOR_FOREACH(acc, i, argv) { eina_array_push(thdat->argv, eina_stringshare_add(argv));