raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b3361f1aadbbd96be8b7c7a015e15cf6fe681e8c

commit b3361f1aadbbd96be8b7c7a015e15cf6fe681e8c
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Thu Dec 1 08:48:25 2016 +0900

    ecore exe - handle scope data get null returns when ppl do bad things
    
    peolpe using ecore_exe in threads... for example.
---
 src/lib/ecore/ecore_exe_posix.c | 178 +++++++++++++++++++++-------------------
 src/lib/ecore/ecore_exe_win32.c |   5 ++
 2 files changed, 100 insertions(+), 83 deletions(-)

diff --git a/src/lib/ecore/ecore_exe_posix.c b/src/lib/ecore/ecore_exe_posix.c
index 14c7d69..d6683a2 100644
--- a/src/lib/ecore/ecore_exe_posix.c
+++ b/src/lib/ecore/ecore_exe_posix.c
@@ -884,29 +884,32 @@ _ecore_exe_make_sure_its_dead(void *data)
 
    dead = data;
    if (dead)
-   {
-      Ecore_Exe *obj = NULL;
+     {
+        Ecore_Exe *obj = NULL;
 
-      if ((obj = _ecore_exe_is_it_alive(dead->pid)))
-      {
-         Ecore_Exe_Data *exe = efl_data_scope_get(obj, MY_CLASS);
-         if (dead->cmd)
-           INF("Sending KILL signal to allegedly dead %s (%d).",
-               dead->cmd, dead->pid);
-         else
-           INF("Sending KILL signal to allegedly dead PID %d.",
-               dead->pid);
-         exe->doomsday_clock =
-           ecore_timer_add(10.0, _ecore_exe_make_sure_its_really_dead,
-                           dead);
-         kill(dead->pid, SIGKILL);
-      }
-      else
-      {
-         IF_FREE(dead->cmd);
-         free(dead);
-      }
-   }
+        if ((obj = _ecore_exe_is_it_alive(dead->pid)))
+          {
+             Ecore_Exe_Data *exe = efl_data_scope_get(obj, MY_CLASS);
+             if (exe)
+               {
+                  if (dead->cmd)
+                    INF("Sending KILL signal to allegedly dead %s (%d).",
+                        dead->cmd, dead->pid);
+                  else
+                    INF("Sending KILL signal to allegedly dead PID %d.",
+                        dead->pid);
+                  exe->doomsday_clock =
+                    ecore_timer_add(10.0, _ecore_exe_make_sure_its_really_dead,
+                                    dead);
+                  kill(dead->pid, SIGKILL);
+               }
+          }
+        else
+          {
+             IF_FREE(dead->cmd);
+             free(dead);
+          }
+     }
    return ECORE_CALLBACK_CANCEL;
 }
 
@@ -917,22 +920,26 @@ _ecore_exe_make_sure_its_really_dead(void *data)
 
    dead = data;
    if (dead)
-   {
-      Ecore_Exe *obj = NULL;
+     {
+        Ecore_Exe *obj = NULL;
 
-      if ((obj = _ecore_exe_is_it_alive(dead->pid)))
-      {
-         Ecore_Exe_Data *exe = efl_data_scope_get(obj, MY_CLASS);
-         ERR("RUN!  The zombie wants to eat your brains!  And your CPU!");
-         if (dead->cmd)
-           INF("%s (%d) is not really dead.", dead->cmd, dead->pid);
-         else
-           INF("PID %d is not really dead.", dead->pid);
-         exe->doomsday_clock = NULL;
-      }
-      IF_FREE(dead->cmd);
-      free(dead);
-   }
+        if ((obj = _ecore_exe_is_it_alive(dead->pid)))
+          {
+             Ecore_Exe_Data *exe = efl_data_scope_get(obj, MY_CLASS);
+
+             if (exe)
+               {
+                  ERR("RUN!  The zombie wants to eat your brains!  And your 
CPU!");
+                  if (dead->cmd)
+                    INF("%s (%d) is not really dead.", dead->cmd, dead->pid);
+                  else
+                    INF("PID %d is not really dead.", dead->pid);
+                  exe->doomsday_clock = NULL;
+               }
+             IF_FREE(dead->cmd);
+             free(dead);
+          }
+     }
    return ECORE_CALLBACK_CANCEL;
 }
 
@@ -940,6 +947,7 @@ Ecore_Timer *
 _ecore_exe_doomsday_clock_get(Ecore_Exe *obj)
 {
    Ecore_Exe_Data *exe = efl_data_scope_get(obj, MY_CLASS);
+   if (!exe) return NULL;
    return exe->doomsday_clock;
 }
 
@@ -948,6 +956,7 @@ _ecore_exe_doomsday_clock_set(Ecore_Exe   *obj,
                               Ecore_Timer *dc)
 {
    Ecore_Exe_Data *exe = efl_data_scope_get(obj, MY_CLASS);
+   if (!exe) return;
    exe->doomsday_clock = dc;
 }
 
@@ -1071,6 +1080,7 @@ _ecore_exe_data_generic_handler(void             *data,
    const Efl_Event_Description *eo_event = NULL;
 
    Ecore_Exe_Data *exe = efl_data_scope_get(obj, MY_CLASS);
+   if (!exe) return EINA_FALSE;
 
    /* Sort out what sort of handler we are. */
    if (flags & ECORE_EXE_PIPE_READ)
@@ -1225,26 +1235,28 @@ _ecore_exe_data_write_handler(void             *data,
    Ecore_Exe *obj = data;
    Ecore_Exe_Data *exe = efl_data_scope_get(obj, MY_CLASS);
 
+   if (!exe) return EINA_FALSE;
+
    if ((exe->write_fd_handler) &&
        (ecore_main_fd_handler_active_get
-          (exe->write_fd_handler, ECORE_FD_WRITE)))
+        (exe->write_fd_handler, ECORE_FD_WRITE)))
      _ecore_exe_flush(obj);
 
    /* If we have sent all there is to send, and we need to close the pipe, 
then close it. */
-   if ((exe->close_stdin == 1)
-       && (exe->write_data_size == exe->write_data_offset))
-   {
-      int ok = 0;
-      int result;
-
-      INF("Closing stdin for %s", exe->cmd);
-      /* if (exe->child_fd_write != -1)  E_NO_ERRNO(result, 
fsync(exe->child_fd_write), ok);   This a) doesn't work, and b) isn't needed. */
-      IF_FN_DEL(ecore_main_fd_handler_del, exe->write_fd_handler);
-      if (exe->child_fd_write != -1)
-        E_NO_ERRNO(result, close(exe->child_fd_write), ok);
-      exe->child_fd_write = -1;
-      IF_FREE(exe->write_data_buf);
-   }
+   if ((exe->close_stdin == 1) &&
+       (exe->write_data_size == exe->write_data_offset))
+     {
+        int ok = 0;
+        int result;
+
+        INF("Closing stdin for %s", exe->cmd);
+        /* if (exe->child_fd_write != -1)  E_NO_ERRNO(result, 
fsync(exe->child_fd_write), ok);   This a) doesn't work, and b) isn't needed. */
+        IF_FN_DEL(ecore_main_fd_handler_del, exe->write_fd_handler);
+        if (exe->child_fd_write != -1)
+          E_NO_ERRNO(result, close(exe->child_fd_write), ok);
+        exe->child_fd_write = -1;
+        IF_FREE(exe->write_data_buf);
+     }
 
    return ECORE_CALLBACK_RENEW;
 }
@@ -1255,36 +1267,35 @@ _ecore_exe_flush(Ecore_Exe *obj)
    int count;
    Ecore_Exe_Data *exe = efl_data_scope_get(obj, MY_CLASS);
 
+   if (!exe) return;
    /* check whether we need to write anything at all. */
-   if ((exe->child_fd_write == -1) || (!exe->write_data_buf))
-     return;
-   if (exe->write_data_size == exe->write_data_offset)
-     return;
+   if ((exe->child_fd_write == -1) || (!exe->write_data_buf)) return;
+   if (exe->write_data_size == exe->write_data_offset) return;
 
    count = write(exe->child_fd_write,
                  (char *)exe->write_data_buf + exe->write_data_offset,
                  exe->write_data_size - exe->write_data_offset);
    if (count < 1)
-   {
-      if (errno == EIO || errno == EBADF || errno == EPIPE || errno == EINVAL 
|| errno == ENOSPC) /* we lost our exe! */
-      {
-         ecore_exe_terminate(obj);
-         if (exe->write_fd_handler)
-           ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
-      }
-   }
+     {
+        if (errno == EIO || errno == EBADF || errno == EPIPE || errno == 
EINVAL || errno == ENOSPC) /* we lost our exe! */
+          {
+             ecore_exe_terminate(obj);
+             if (exe->write_fd_handler)
+               ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
+          }
+     }
    else
-   {
-      exe->write_data_offset += count;
-      if (exe->write_data_offset >= exe->write_data_size) /* Nothing left to 
write, clean up. */
-      {
-         exe->write_data_size = 0;
-         exe->write_data_offset = 0;
-         IF_FREE(exe->write_data_buf);
-         if (exe->write_fd_handler)
-           ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
-      }
-   }
+     {
+        exe->write_data_offset += count;
+        if (exe->write_data_offset >= exe->write_data_size) /* Nothing left to 
write, clean up. */
+          {
+             exe->write_data_size = 0;
+             exe->write_data_offset = 0;
+             IF_FREE(exe->write_data_buf);
+             if (exe->write_fd_handler)
+               ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
+          }
+     }
 }
 
 static void
@@ -1293,15 +1304,16 @@ _ecore_exe_dead_attach(Ecore_Exe *obj)
    struct _ecore_exe_dead_exe *dead;
    Ecore_Exe_Data *exe = efl_data_scope_get(obj, MY_CLASS);
 
+   if (!exe) return;
    if (exe->doomsday_clock_dead) return;
    dead = calloc(1, sizeof(struct _ecore_exe_dead_exe));
    if (dead)
-   {
-      dead->pid = exe->pid;
-      if (exe->cmd) dead->cmd = strdup(exe->cmd);
-      IF_FN_DEL(ecore_timer_del, exe->doomsday_clock);
-      exe->doomsday_clock =
-        ecore_timer_add(10.0, _ecore_exe_make_sure_its_dead, dead);
-      exe->doomsday_clock_dead = dead;
-   }
+     {
+        dead->pid = exe->pid;
+        if (exe->cmd) dead->cmd = strdup(exe->cmd);
+        IF_FN_DEL(ecore_timer_del, exe->doomsday_clock);
+        exe->doomsday_clock =
+          ecore_timer_add(10.0, _ecore_exe_make_sure_its_dead, dead);
+        exe->doomsday_clock_dead = dead;
+     }
 }
diff --git a/src/lib/ecore/ecore_exe_win32.c b/src/lib/ecore/ecore_exe_win32.c
index e2ef5ac..11c6f1f 100644
--- a/src/lib/ecore/ecore_exe_win32.c
+++ b/src/lib/ecore/ecore_exe_win32.c
@@ -43,6 +43,7 @@ _ecore_exe_threads_terminate(Ecore_Exe *obj)
    HANDLE threads[2] = { NULL, NULL };
    int i = 0;
 
+   if (!exe) return;
    if (exe->pipe_read.thread)
      {
         threads[i] = exe->pipe_read.thread;
@@ -71,6 +72,7 @@ _ecore_exe_close_cb(void *data,
    Ecore_Exe_Data *exe = efl_data_scope_get(obj, ECORE_EXE_CLASS);
    DWORD exit_code = 0;
 
+   if (!exe) return 0;
    _ecore_exe_threads_terminate(obj);
 
    e = calloc(1, sizeof(Ecore_Exe_Event_Del));
@@ -112,6 +114,7 @@ _ecore_exe_pipe_read_thread_cb(void *data)
    DWORD current_size = 0;
    BOOL res;
 
+   if (!exe) return 0;
    while (1)
      {
         res = PeekNamedPipe(exe->pipe_read.child_pipe,
@@ -182,6 +185,7 @@ _ecore_exe_pipe_error_thread_cb(void *data)
    DWORD current_size = 0;
    BOOL res;
 
+   if (!exe) return 0;
    while (1)
      {
         res = PeekNamedPipe(exe->pipe_error.child_pipe,
@@ -256,6 +260,7 @@ _ecore_exe_enum_windows_procedure(HWND window,
    Ecore_Exe_Data *exe = efl_data_scope_get(obj, ECORE_EXE_CLASS);
    DWORD thread_id;
 
+   if (!exe) return EINA_FALSE;
    thread_id = GetWindowThreadProcessId(window, NULL);
 
    if (thread_id == exe->thread_id)

-- 


Reply via email to