mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-22 07:09:54 +00:00
Avoid double svg error reporting and segfaults
* src/image.c (svg_load_image): Use g_error_free directly instead of the helder g_clear_error (since we're only calling it with non-nil values). (svg_load_image): Avoid segfault and double reporting errors. * test/manual/image-tests.el (image-tests-load-image/svg-too-big) (image-tests-load-image/svg-invalid): Test it (bug#57755).
This commit is contained in:
parent
89199f16ae
commit
dd22694421
27
src/image.c
27
src/image.c
@ -10907,7 +10907,7 @@ DEF_DLL_FN (int, gdk_pixbuf_get_bits_per_sample, (const GdkPixbuf *));
|
|||||||
DEF_DLL_FN (void, g_type_init, (void));
|
DEF_DLL_FN (void, g_type_init, (void));
|
||||||
# endif
|
# endif
|
||||||
DEF_DLL_FN (void, g_object_unref, (gpointer));
|
DEF_DLL_FN (void, g_object_unref, (gpointer));
|
||||||
DEF_DLL_FN (void, g_clear_error, (GError **));
|
DEF_DLL_FN (void, g_error_free, (GError *));
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
init_svg_functions (void)
|
init_svg_functions (void)
|
||||||
@ -10967,7 +10967,7 @@ init_svg_functions (void)
|
|||||||
LOAD_DLL_FN (gobject, g_type_init);
|
LOAD_DLL_FN (gobject, g_type_init);
|
||||||
# endif
|
# endif
|
||||||
LOAD_DLL_FN (gobject, g_object_unref);
|
LOAD_DLL_FN (gobject, g_object_unref);
|
||||||
LOAD_DLL_FN (glib, g_clear_error);
|
LOAD_DLL_FN (glib, g_error_free);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -10983,7 +10983,7 @@ init_svg_functions (void)
|
|||||||
# undef gdk_pixbuf_get_pixels
|
# undef gdk_pixbuf_get_pixels
|
||||||
# undef gdk_pixbuf_get_rowstride
|
# undef gdk_pixbuf_get_rowstride
|
||||||
# undef gdk_pixbuf_get_width
|
# undef gdk_pixbuf_get_width
|
||||||
# undef g_clear_error
|
# undef g_error_free
|
||||||
# undef g_object_unref
|
# undef g_object_unref
|
||||||
# undef g_type_init
|
# undef g_type_init
|
||||||
# if LIBRSVG_CHECK_VERSION (2, 52, 1)
|
# if LIBRSVG_CHECK_VERSION (2, 52, 1)
|
||||||
@ -11019,7 +11019,7 @@ init_svg_functions (void)
|
|||||||
# define gdk_pixbuf_get_pixels fn_gdk_pixbuf_get_pixels
|
# define gdk_pixbuf_get_pixels fn_gdk_pixbuf_get_pixels
|
||||||
# define gdk_pixbuf_get_rowstride fn_gdk_pixbuf_get_rowstride
|
# define gdk_pixbuf_get_rowstride fn_gdk_pixbuf_get_rowstride
|
||||||
# define gdk_pixbuf_get_width fn_gdk_pixbuf_get_width
|
# define gdk_pixbuf_get_width fn_gdk_pixbuf_get_width
|
||||||
# define g_clear_error fn_g_clear_error
|
# define g_error_free fn_g_error_free
|
||||||
# define g_object_unref fn_g_object_unref
|
# define g_object_unref fn_g_object_unref
|
||||||
# if ! GLIB_CHECK_VERSION (2, 36, 0)
|
# if ! GLIB_CHECK_VERSION (2, 36, 0)
|
||||||
# define g_type_init fn_g_type_init
|
# define g_type_init fn_g_type_init
|
||||||
@ -11353,7 +11353,7 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
|
|||||||
if (! check_image_size (f, width, height))
|
if (! check_image_size (f, width, height))
|
||||||
{
|
{
|
||||||
image_size_error ();
|
image_size_error ();
|
||||||
goto rsvg_error;
|
goto done_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We are now done with the unmodified data. */
|
/* We are now done with the unmodified data. */
|
||||||
@ -11536,9 +11536,21 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
|
|||||||
image_put_x_image (f, img, ximg, 0);
|
image_put_x_image (f, img, ximg, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eassume (err == NULL);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
rsvg_error:
|
rsvg_error:
|
||||||
|
if (err == NULL)
|
||||||
|
image_error ("Error parsing SVG image");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
image_error ("Error parsing SVG image: %s",
|
||||||
|
call2 (Qstring_trim_right, build_string (err->message),
|
||||||
|
Qnil));
|
||||||
|
g_error_free (err);
|
||||||
|
}
|
||||||
|
|
||||||
|
done_error:
|
||||||
if (rsvg_handle)
|
if (rsvg_handle)
|
||||||
g_object_unref (rsvg_handle);
|
g_object_unref (rsvg_handle);
|
||||||
if (wrapped_contents)
|
if (wrapped_contents)
|
||||||
@ -11547,10 +11559,6 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
|
|||||||
if (css && !STRINGP (lcss))
|
if (css && !STRINGP (lcss))
|
||||||
xfree (css);
|
xfree (css);
|
||||||
#endif
|
#endif
|
||||||
image_error ("Error parsing SVG image: %s",
|
|
||||||
/* The -1 removes an extra newline. */
|
|
||||||
make_string (err->message, strlen (err->message) - 1));
|
|
||||||
g_clear_error (&err);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12265,4 +12273,5 @@ The options are:
|
|||||||
imagemagick_render_type = 0;
|
imagemagick_render_type = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
DEFSYM (Qstring_trim_right, "string-trim-right");
|
||||||
}
|
}
|
||||||
|
@ -79,6 +79,21 @@
|
|||||||
(image-tests-make-load-image-test 'xbm)
|
(image-tests-make-load-image-test 'xbm)
|
||||||
(image-tests-make-load-image-test 'xpm)
|
(image-tests-make-load-image-test 'xpm)
|
||||||
|
|
||||||
|
(ert-deftest image-tests-load-image/svg-too-big ()
|
||||||
|
(with-temp-buffer
|
||||||
|
(let* ((max-image-size 0)
|
||||||
|
(messages-buffer-name (buffer-name (current-buffer)))
|
||||||
|
(img (cdr (assq 'svg image-tests--images)))
|
||||||
|
(file (if (listp img)
|
||||||
|
(plist-get (cdr img) :file)
|
||||||
|
img)))
|
||||||
|
(save-excursion (find-file file))
|
||||||
|
(should (string-match-p "invalid image size" (buffer-string)))
|
||||||
|
;; no annoying newlines
|
||||||
|
(should-not (string-match-p "^[ \t\n\r]+$" (buffer-string)))
|
||||||
|
;; no annoying double error reporting
|
||||||
|
(should-not (string-match-p "error parsing" (buffer-string))))))
|
||||||
|
|
||||||
(ert-deftest image-tests-load-image/svg-invalid ()
|
(ert-deftest image-tests-load-image/svg-invalid ()
|
||||||
(with-temp-buffer
|
(with-temp-buffer
|
||||||
(let ((messages-buffer-name (buffer-name (current-buffer))))
|
(let ((messages-buffer-name (buffer-name (current-buffer))))
|
||||||
@ -90,7 +105,9 @@
|
|||||||
:type svg)))
|
:type svg)))
|
||||||
(redisplay))
|
(redisplay))
|
||||||
;; librsvg error: "... Start tag expected, '<' not found [3 times]"
|
;; librsvg error: "... Start tag expected, '<' not found [3 times]"
|
||||||
(should (string-match "[Ee]rror.+Start tag expected" (buffer-string))))))
|
(should (string-match-p "[Ee]rror.+Start tag expected" (buffer-string)))
|
||||||
|
;; no annoying newlines
|
||||||
|
(should-not (string-match-p "^[ \t\n\r]+$" (buffer-string))))))
|
||||||
|
|
||||||
|
|
||||||
;;;; image-test-size
|
;;;; image-test-size
|
||||||
|
Loading…
Reference in New Issue
Block a user