From b5a674a757d4ad934eb505f4e3c50ee1180f3693 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Tue, 8 Aug 2017 19:12:51 +0200 Subject: [PATCH 1/3] thumbnail: Don't crash if the thumbnailer could not be setup script_exec_new() can fail in certain cases, and we should not crash when trying to expand the script command later if the initial setup failed. https://bugzilla.gnome.org/show_bug.cgi?id=785963 --- libgnome-desktop/gnome-desktop-thumbnail-script.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libgnome-desktop/gnome-desktop-thumbnail-script.c b/libgnome-desktop/gnome-desktop-thumbnail-script.c index 5a5f05f4..d9437d40 100644 --- a/libgnome-desktop/gnome-desktop-thumbnail-script.c +++ b/libgnome-desktop/gnome-desktop-thumbnail-script.c @@ -657,6 +657,9 @@ child_setup (gpointer user_data) static void script_exec_free (ScriptExec *exec) { + if (exec == NULL) + return; + g_free (exec->infile); if (exec->outfile) { @@ -757,6 +760,8 @@ gnome_desktop_thumbnail_script_exec (const char *cmd, ScriptExec *exec; exec = script_exec_new (uri); + if (!exec) + goto out; expanded_script = expand_thumbnailing_cmd (cmd, exec, size, error); if (expanded_script == NULL) goto out; -- 2.13.4 From 99df9a83a36882d8a666176d9452283ae065d014 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Tue, 8 Aug 2017 19:14:09 +0200 Subject: [PATCH 2/3] thumbnail: Report errors when script_exec_new() fails Makes it easier to debug. https://bugzilla.gnome.org/show_bug.cgi?id=785963 --- libgnome-desktop/gnome-desktop-thumbnail-script.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/libgnome-desktop/gnome-desktop-thumbnail-script.c b/libgnome-desktop/gnome-desktop-thumbnail-script.c index d9437d40..1012efa8 100644 --- a/libgnome-desktop/gnome-desktop-thumbnail-script.c +++ b/libgnome-desktop/gnome-desktop-thumbnail-script.c @@ -687,7 +687,8 @@ clear_fd (gpointer data) } static ScriptExec * -script_exec_new (const char *uri) +script_exec_new (const char *uri, + GError **error) { ScriptExec *exec; g_autoptr(GFile) file = NULL; @@ -705,7 +706,11 @@ script_exec_new (const char *uri) exec->infile = g_file_get_path (file); if (!exec->infile) - goto bail; + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + "Could not get path for URI '%s'", uri); + goto bail; + } #ifdef HAVE_BWRAP if (exec->sandbox) @@ -719,7 +724,11 @@ script_exec_new (const char *uri) tmpl = g_strdup ("/tmp/gnome-desktop-thumbnailer-XXXXXX"); exec->outdir = g_mkdtemp (tmpl); if (!exec->outdir) - goto bail; + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Could not create temporary sandbox directory"); + goto bail; + } exec->outfile = g_build_filename (exec->outdir, "gnome-desktop-thumbnailer.png", NULL); ext = get_extension (exec->infile); @@ -732,7 +741,7 @@ script_exec_new (const char *uri) int fd; g_autofree char *tmpname = NULL; - fd = g_file_open_tmp (".gnome_desktop_thumbnail.XXXXXX", &tmpname, NULL); + fd = g_file_open_tmp (".gnome_desktop_thumbnail.XXXXXX", &tmpname, error); if (fd == -1) goto bail; close (fd); @@ -759,7 +768,7 @@ gnome_desktop_thumbnail_script_exec (const char *cmd, GBytes *image = NULL; ScriptExec *exec; - exec = script_exec_new (uri); + exec = script_exec_new (uri, error); if (!exec) goto out; expanded_script = expand_thumbnailing_cmd (cmd, exec, size, error); -- 2.13.4 From f96041679f46ece036d742bde7d78afc67d73519 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Tue, 8 Aug 2017 19:20:31 +0200 Subject: [PATCH 3/3] thumbnail: And print those errors in the debug https://bugzilla.gnome.org/show_bug.cgi?id=785963 --- libgnome-desktop/gnome-desktop-thumbnail.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libgnome-desktop/gnome-desktop-thumbnail.c b/libgnome-desktop/gnome-desktop-thumbnail.c index 73751f69..866fc7d2 100644 --- a/libgnome-desktop/gnome-desktop-thumbnail.c +++ b/libgnome-desktop/gnome-desktop-thumbnail.c @@ -1066,13 +1066,20 @@ gnome_desktop_thumbnail_factory_generate_thumbnail (GnomeDesktopThumbnailFactory if (script) { GBytes *data; + GError *error = NULL; - data = gnome_desktop_thumbnail_script_exec (script, size, uri, NULL); + data = gnome_desktop_thumbnail_script_exec (script, size, uri, &error); if (data) { pixbuf = pixbuf_new_from_bytes (data, NULL); g_bytes_unref (data); } + else + { + g_debug ("Thumbnail script ('%s') failed for '%s': %s", + script, uri, error ? error->message : "no details"); + g_clear_error (&error); + } } g_free (script); -- 2.13.4