]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix potential buffer overflow (bug#50767)
authorAlan Third <alan@idiocy.org>
Mon, 4 Oct 2021 21:35:41 +0000 (22:35 +0100)
committerAlan Third <alan@idiocy.org>
Sun, 17 Oct 2021 09:54:18 +0000 (10:54 +0100)
* src/image.c (svg_load_image): Check how many bytes were actually
written to the buffer.  Don't check xmalloc return value as xmalloc
doesn't return if it fails.

src/image.c

index 206c7baa2f87355e8bfec431d1f94c878542f7fd..49b26301e8b179765af0c6e1f973a40a45ed1c16 100644 (file)
@@ -9996,10 +9996,16 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
   if (!STRINGP (lcss))
     {
       /* Generate the CSS for the SVG image.  */
-      const char *css_spec = "svg{font-family:\"%s\";font-size:%4dpx}";
-      int css_len = strlen (css_spec) + strlen (img->face_font_family);
+      /* FIXME: The below calculations leave enough space for a font
+        size up to 9999, if it overflows we just throw an error but
+        should probably increase the buffer size.  */
+      const char *css_spec = "svg{font-family:\"%s\";font-size:%dpx}";
+      int css_len = strlen (css_spec) + strlen (img->face_font_family) + 1;
       css = xmalloc (css_len);
-      snprintf (css, css_len, css_spec, img->face_font_family, img->face_font_size);
+      if (css_len <= snprintf (css, css_len, css_spec,
+                              img->face_font_family, img->face_font_size))
+       goto rsvg_error;
+
       rsvg_handle_set_stylesheet (rsvg_handle, (guint8 *)css, strlen (css), NULL);
     }
   else
@@ -10157,12 +10163,11 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
 
     wrapped_contents = xmalloc (buffer_size);
 
-    if (!wrapped_contents
-        || buffer_size <= snprintf (wrapped_contents, buffer_size, wrapper,
-                                    foreground & 0xFFFFFF, width, height,
-                                    viewbox_width, viewbox_height,
-                                    background & 0xFFFFFF,
-                                    SSDATA (encoded_contents)))
+    if (buffer_size <= snprintf (wrapped_contents, buffer_size, wrapper,
+                                foreground & 0xFFFFFF, width, height,
+                                viewbox_width, viewbox_height,
+                                background & 0xFFFFFF,
+                                SSDATA (encoded_contents)))
       goto rsvg_error;
 
     wrapped_size = strlen (wrapped_contents);