1
0
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:
dickmao 2022-09-13 13:57:44 +02:00 committed by Lars Ingebrigtsen
parent 89199f16ae
commit dd22694421
2 changed files with 36 additions and 10 deletions

View File

@ -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");
} }

View File

@ -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