summaryrefslogtreecommitdiff
path: root/src/generic
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2020-12-12 02:22:06 +0000
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2020-12-12 02:22:06 +0000
commita43c2dad505dbce76b955422c41091fc5b0efc2b (patch)
tree4b994abfcf006e685b073e6a44d74af8494b5fd0 /src/generic
parentdc0173fdf6d586f9167643213850c8b08b8ff3fa (diff)
downloadefl-a43c2dad505dbce76b955422c41091fc5b0efc2b.tar.gz
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.
Diffstat (limited to 'src/generic')
-rw-r--r--src/generic/evas/common/timeout.c11
-rw-r--r--src/generic/evas/common/timeout.h1
-rw-r--r--src/generic/evas/pdf/main.cpp79
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;
}