raster pushed a commit to branch master.

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

commit a43c2dad505dbce76b955422c41091fc5b0efc2b
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Sat Dec 12 02:22:06 2020 +0000

    evas generic pdf - handle cleanupp on crashes in poppler and other errors
    
    if poppler_init fails or it crashes in poppler or a timeout we didnt clean
    up the tmpdir... this forces a cleanuo and ups timeout to 30sec.
---
 src/generic/evas/common/timeout.c | 11 ++++++
 src/generic/evas/common/timeout.h |  1 +
 src/generic/evas/pdf/main.cpp     | 79 ++++++++++++++++++++++++++++++---------
 3 files changed, 74 insertions(+), 17 deletions(-)

diff --git a/src/generic/evas/common/timeout.c 
b/src/generic/evas/common/timeout.c
index 844884c8e0..1b05a7db56 100644
--- a/src/generic/evas/common/timeout.c
+++ b/src/generic/evas/common/timeout.c
@@ -1,3 +1,6 @@
+#include <stdio.h>
+static void (*timeout_func) (void) = NULL;
+
 #ifdef _WIN32
 # include <stdio.h>
 # include <windows.h>
@@ -8,6 +11,7 @@ _timeout(void *arg)
 {
    int s = (int)(uintptr_t)arg;
    Sleep(s * 1000);
+   if (timeout_func) timeout_func();
    _Exit(-1);
    _endthreadex(0);
    return 0;
@@ -26,6 +30,7 @@ timeout_init(int seconds)
 static void
 _timeout(int val)
 {
+   if (timeout_func) timeout_func();
    _exit(-1);
    if (val) return;
 }
@@ -37,3 +42,9 @@ timeout_init(int seconds)
    alarm(seconds);
 }
 #endif
+
+void
+timeout_func_set(void (*func) (void))
+{
+   timeout_func = func;
+}
diff --git a/src/generic/evas/common/timeout.h 
b/src/generic/evas/common/timeout.h
index 2ea039badf..5cd4c8b54d 100644
--- a/src/generic/evas/common/timeout.h
+++ b/src/generic/evas/common/timeout.h
@@ -6,6 +6,7 @@ extern "C" {
 #endif
 
 void timeout_init(int seconds);
+void timeout_func_set(void (*func) (void));
 
 #ifdef __cplusplus
 }
diff --git a/src/generic/evas/pdf/main.cpp b/src/generic/evas/pdf/main.cpp
index c7c3ee13bd..5c70bfef21 100644
--- a/src/generic/evas/pdf/main.cpp
+++ b/src/generic/evas/pdf/main.cpp
@@ -18,6 +18,11 @@
 #include "shmfile.h"
 #include "timeout.h"
 
+#ifndef _WIN32
+# include <unistd.h>
+# include <signal.h>
+#endif
+
 #define DATA32 unsigned int
 typedef char RGB24[3];
 
@@ -192,11 +197,43 @@ void poppler_load_image(int size_w EINA_UNUSED, int 
size_h EINA_UNUSED)
    delete renderer;
 }
 
+static Eina_Tmpstr *tmpdir = NULL;
+static Eina_Tmpstr *generated = NULL;
+
+static void
+tmp_cleanup(void)
+{
+   if (tmpdir)
+     {
+        if (generated)
+          {
+             unlink(generated);
+          }
+        if (rmdir(tmpdir) < 0)
+          {
+             D("Failed to delete tmpdir %s\n", tmpdir);
+          }
+        eina_tmpstr_del(tmpdir);
+        tmpdir = NULL;
+        if (generated)
+          {
+             eina_tmpstr_del(generated);
+             generated = NULL;
+          }
+     }
+}
+
+static void
+_crash(int val)
+{
+   D("Crash\n");
+   tmp_cleanup();
+   _exit(-1 | val);
+}
+
 int
 main(int argc, char **argv)
 {
-   Eina_Tmpstr *tmpdir = NULL;
-   Eina_Tmpstr *generated = NULL;
    char *extension;
    char *dir;
    char *file;
@@ -204,6 +241,7 @@ main(int argc, char **argv)
    int size_w = 0, size_h = 0;
    int head_only = 0;
    int page_num = 0;
+   int ret = 0;
 
    if (argc < 2) return -1;
    // file is ALWAYS first arg, other options come after
@@ -247,6 +285,18 @@ main(int argc, char **argv)
    dir = dirname(argv[0]);
    if (extension && dir && strcmp(extension, ".pdf"))
      {
+#ifndef _WIN32
+        signal(SIGSEGV, _crash);
+        signal(SIGBUS, _crash);
+        signal(SIGFPE, _crash);
+        signal(SIGABRT, _crash);
+        signal(SIGILL, _crash);
+        signal(SIGSYS, _crash);
+        signal(SIGINT, _crash);
+        signal(SIGTERM, _crash);
+        signal(SIGQUIT, _crash);
+#endif
+        timeout_func_set(tmp_cleanup);
         if (eina_file_mkdtemp("evas_generic_pdf_loaderXXXXXX", &tmpdir))
           {
              Eina_Strbuf *tmp;
@@ -270,6 +320,7 @@ main(int argc, char **argv)
                   pclose(cmd);
 
                   filename = basename(file);
+
                   generated = eina_tmpstr_add_length(filename, 
strlen(filename) - strlen(extension));
 
                   eina_strbuf_append_printf(tmp, "%s/%s.pdf", tmpdir, 
generated);
@@ -291,12 +342,15 @@ main(int argc, char **argv)
      }
 
    // Let's force a timeout if things go wrong
-   timeout_init(10);
+   timeout_init(30);
 
    // Now process the pdf (or the generated pdf)
    D("poppler_file_init\n");
    if (!poppler_init(file, page_num, size_w, size_h))
-     return -1;
+     {
+        goto cleanup;
+        ret = 1;
+     }
    D("poppler_file_init done\n");
 
    D("dpi2...: %f\n", dpi);
@@ -338,18 +392,9 @@ main(int argc, char **argv)
      printf("done\n");
 
    poppler_shutdown();
-
-   if (tmpdir)
-     {
-        if (generated) unlink(generated);
-        if (rmdir(tmpdir) < 0)
-          {
-             D("Failed to delete tmpdir %s\n", tmpdir);
-          }
-
-        eina_tmpstr_del(tmpdir);
-        eina_tmpstr_del(generated);
-     }
+cleanup:
+   timeout_func_set(NULL);
+   tmp_cleanup();
    fflush(stdout);
-   return 0;
+   return ret;
 }

-- 


Reply via email to