f0ad2aa
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
f0ad2aa
From: Daniel Axtens <dja@axtens.net>
f0ad2aa
Date: Mon, 28 Jun 2021 14:25:17 +1000
f0ad2aa
Subject: [PATCH] video/readers/jpeg: Refuse to handle multiple start of
f0ad2aa
 streams
f0ad2aa
f0ad2aa
An invalid file could contain multiple start of stream blocks, which
f0ad2aa
would cause us to reallocate and leak our bitmap. Refuse to handle
f0ad2aa
multiple start of streams.
f0ad2aa
f0ad2aa
Additionally, fix a grub_error() call formatting.
f0ad2aa
f0ad2aa
Signed-off-by: Daniel Axtens <dja@axtens.net>
f0ad2aa
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
f0ad2aa
(cherry picked from commit f3a854def3e281b7ad4bbea730cd3046de1da52f)
f0ad2aa
---
f0ad2aa
 grub-core/video/readers/jpeg.c | 7 +++++--
f0ad2aa
 1 file changed, 5 insertions(+), 2 deletions(-)
f0ad2aa
f0ad2aa
diff --git a/grub-core/video/readers/jpeg.c b/grub-core/video/readers/jpeg.c
f0ad2aa
index caa211f06d..1df1171d78 100644
f0ad2aa
--- a/grub-core/video/readers/jpeg.c
f0ad2aa
+++ b/grub-core/video/readers/jpeg.c
f0ad2aa
@@ -677,6 +677,9 @@ grub_jpeg_decode_sos (struct grub_jpeg_data *data)
f0ad2aa
   if (data->file->offset != data_offset)
f0ad2aa
     return grub_error (GRUB_ERR_BAD_FILE_TYPE, "jpeg: extra byte in sos");
f0ad2aa
 
f0ad2aa
+  if (*data->bitmap)
f0ad2aa
+    return grub_error (GRUB_ERR_BAD_FILE_TYPE, "jpeg: too many start of scan blocks");
f0ad2aa
+
f0ad2aa
   if (grub_video_bitmap_create (data->bitmap, data->image_width,
f0ad2aa
 				data->image_height,
f0ad2aa
 				GRUB_VIDEO_BLIT_FORMAT_RGB_888))
f0ad2aa
@@ -699,8 +702,8 @@ grub_jpeg_decode_data (struct grub_jpeg_data *data)
f0ad2aa
   nc1 = (data->image_width + hb - 1)  >> (3 + data->log_hs);
f0ad2aa
 
f0ad2aa
   if (data->bitmap_ptr == NULL)
f0ad2aa
-    return grub_error(GRUB_ERR_BAD_FILE_TYPE,
f0ad2aa
-		      "jpeg: attempted to decode data before start of stream");
f0ad2aa
+    return grub_error (GRUB_ERR_BAD_FILE_TYPE,
f0ad2aa
+		       "jpeg: attempted to decode data before start of stream");
f0ad2aa
 
f0ad2aa
   for (; data->r1 < nr1 && (!data->dri || rst);
f0ad2aa
        data->r1++, data->bitmap_ptr += (vb * data->image_width - hb * nc1) * 3)