access: Fix crash in ecore
authorJean-Philippe Andre <jp.andre@samsung.com>
Tue, 29 Aug 2017 04:33:49 +0000 (13:33 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Tue, 29 Aug 2017 04:33:49 +0000 (13:33 +0900)
We use a temporary file for espeak (the accessibility text-to-speech
engine we use), and then we remove and close the file. But the fd was
not reset to -1 which meant that later on the previous fd was closed
again (this is kinda weird), but that fd was now invalid. Or rather it
was reused by ecore animator, closing the read-end of the pipe
(timer_fd_read). This caused SIGPIPE in the animator code.

Thanks strace and gdb for helping me figure out this. :)

@fix

src/modules/elementary/access_output/mod.c

index e304c2e..ce8c47d 100644 (file)
@@ -30,6 +30,7 @@ _exe_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
              free(tmpf);
              tmpf = NULL;
              close(tmpfd);
+             tmpfd = -1;
           }
         espeak = NULL;
         if (cb_func) cb_func(cb_data);
@@ -91,7 +92,8 @@ out_read_done(void)
      {
         // FIXME: espeak supporets -v XX for voice locale. should provide this
         // based on actual lang/locale
-        close(tmpfd);
+        if (tmpfd >= 0) close(tmpfd);
+        tmpfd = -1;
         snprintf(buf, sizeof(buf), "espeak -p 2 -s 120 -k 10 -m -f %s", tmpf);
         espeak = ecore_exe_pipe_run(buf,
                                     ECORE_EXE_NOT_LEADER,
@@ -113,6 +115,7 @@ out_cancel(void)
         free(tmpf);
         tmpf = NULL;
         close(tmpfd);
+        tmpfd = -1;
      }
 }