Ecore exe (windows): Fix object destruction/failed creation.
authorTom Hacohen <tom@stosb.com>
Tue, 7 Jul 2015 10:36:06 +0000 (11:36 +0100)
committerTom Hacohen <tom@stosb.com>
Tue, 7 Jul 2015 11:05:34 +0000 (12:05 +0100)
The correct way of disposing of an object in a failed finalisation is to
return NULL, not to delete it.

Also, since the destructor is already called when the object is deleted
anyway, there's no point in having cleanup code in the finalizer too.

@fix

src/lib/ecore/ecore_exe_win32.c

index 54cf626..20a0378 100644 (file)
@@ -412,7 +412,7 @@ _impl_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe)
      }
 
    if (!exe->cmd)
-     goto free_exe;
+     goto error;
 
    /* stdout, stderr and stdin pipes */
 
@@ -424,37 +424,37 @@ _impl_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe)
    if (exe->flags & ECORE_EXE_PIPE_READ)
      {
         if (!CreatePipe(&exe->pipe_read.child_pipe, &exe->pipe_read.child_pipe_x, &sa, 0))
-          goto free_exe_cmd;
+          goto error;
         if (!SetHandleInformation(exe->pipe_read.child_pipe, HANDLE_FLAG_INHERIT, 0))
-          goto close_pipe_read;
+          goto error;
         exe->pipe_read.thread = (HANDLE)_beginthreadex(NULL, 0,
                                                        _ecore_exe_pipe_read_thread_cb,
                                                        obj, 0, NULL);
         if (!exe->pipe_read.thread)
-          goto close_pipe_read;
+          goto error;
      }
 
    /* stderr pipe */
    if (exe->flags & ECORE_EXE_PIPE_ERROR)
      {
         if (!CreatePipe(&exe->pipe_error.child_pipe, &exe->pipe_error.child_pipe_x, &sa, 0))
-          goto close_pipe_read;
+          goto error;
         if (!SetHandleInformation(exe->pipe_error.child_pipe, HANDLE_FLAG_INHERIT, 0))
-          goto close_pipe_error;
+          goto error;
         exe->pipe_error.thread = (HANDLE)_beginthreadex(NULL, 0,
                                                         _ecore_exe_pipe_error_thread_cb,
                                                         obj, 0, NULL);
         if (!exe->pipe_error.thread)
-          goto close_pipe_error;
+          goto error;
      }
 
    /* stdin pipe */
    if (exe->flags & ECORE_EXE_PIPE_WRITE)
      {
         if (!CreatePipe(&exe->pipe_write.child_pipe, &exe->pipe_write.child_pipe_x, &sa, 0))
-          goto close_pipe_read;
+          goto error;
         if (!SetHandleInformation(exe->pipe_write.child_pipe_x, HANDLE_FLAG_INHERIT, 0))
-          goto close_pipe_write;
+          goto error;
      }
 
    /* create child process */
@@ -473,13 +473,13 @@ _impl_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe)
                       run_pri | CREATE_SUSPENDED, NULL, NULL, &si, &pi))
      {
         ERR("Failed to create process %s", exe->cmd);
-        goto close_pipe_write;
+        goto error;
      }
 
    /* be sure that the child process is running */
    /* FIXME: This does not work if the child is an EFL-based app */
    /* if (WaitForInputIdle(pi.hProcess, INFINITE) == WAIT_FAILED) */
-   /*   goto close_pipe_write; */
+   /*   goto error; */
 
    exe->process = pi.hProcess;
    exe->process_thread = pi.hThread;
@@ -489,18 +489,18 @@ _impl_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe)
    exe->h_close = ecore_main_win32_handler_add(exe->process,
                                                _ecore_exe_close_cb, obj);
    if (!exe->h_close)
-     goto close_process;
+     goto error;
 
    if (ResumeThread(exe->process_thread) == ((DWORD)-1))
      {
         ERR("Could not resume process");
-        goto delete_h_close;
+        goto error;
      }
 
    _ecore_exe_exes = eina_list_append(_ecore_exe_exes, obj);
 
    e = (Ecore_Exe_Event_Add *)calloc(1, sizeof(Ecore_Exe_Event_Add));
-   if (!e) goto delete_h_close;
+   if (!e) goto error;
 
    e->exe = obj;
 
@@ -509,33 +509,7 @@ _impl_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe)
 
    return obj;
 
-delete_h_close:
-   ecore_main_win32_handler_del(exe->h_close);
- close_process:
-   CloseHandle(exe->process_thread);
-   CloseHandle(exe->process);
- close_pipe_write:
-   if (exe->pipe_write.child_pipe)
-     CloseHandle(exe->pipe_write.child_pipe);
-   if (exe->pipe_write.child_pipe_x)
-     CloseHandle(exe->pipe_write.child_pipe_x);
- close_pipe_error:
-   _ecore_exe_threads_terminate(obj);
-   if (exe->pipe_error.child_pipe)
-     CloseHandle(exe->pipe_error.child_pipe);
-   if (exe->pipe_error.child_pipe_x)
-     CloseHandle(exe->pipe_error.child_pipe_x);
- close_pipe_read:
-   _ecore_exe_threads_terminate(obj);
-   if (exe->pipe_read.child_pipe)
-     CloseHandle(exe->pipe_read.child_pipe);
-   if (exe->pipe_read.child_pipe_x)
-     CloseHandle(exe->pipe_read.child_pipe_x);
- free_exe_cmd:
-   free(exe->cmd);
- free_exe:
-   eo_del(obj);
-
+error:
    return NULL;
 }
 
@@ -689,24 +663,30 @@ _impl_ecore_exe_eo_base_destructor(Eo *obj, Ecore_Exe_Data *exe)
    if (exe->pre_free_cb)
      exe->pre_free_cb(data, obj);
 
-   /* if (exe->h_close) */
-   /*   ecore_main_win32_handler_del(exe->h_close); */
+   if (exe->h_close)
+      ecore_main_win32_handler_del(exe->h_close);
+
    CloseHandle(exe->process_thread);
    CloseHandle(exe->process);
+
    if (exe->pipe_write.child_pipe)
      CloseHandle(exe->pipe_write.child_pipe);
    if (exe->pipe_write.child_pipe_x)
      CloseHandle(exe->pipe_write.child_pipe_x);
+
    _ecore_exe_threads_terminate(obj);
    if (exe->pipe_error.child_pipe)
      CloseHandle(exe->pipe_error.child_pipe);
    if (exe->pipe_error.child_pipe_x)
      CloseHandle(exe->pipe_error.child_pipe_x);
+
    if (exe->pipe_read.child_pipe)
      CloseHandle(exe->pipe_read.child_pipe);
    if (exe->pipe_read.child_pipe_x)
      CloseHandle(exe->pipe_read.child_pipe_x);
-   free(exe->cmd);
+
+   if (exe->cmd)
+      free(exe->cmd);
 
    _ecore_exe_exes = eina_list_remove(_ecore_exe_exes, obj);
    IF_FREE(exe->tag);