f0ad2aa
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
f0ad2aa
From: Daniel Axtens <dja@axtens.net>
f0ad2aa
Date: Tue, 13 Jul 2021 13:24:38 +1000
f0ad2aa
Subject: [PATCH] normal/charset: Fix array out-of-bounds formatting unicode
f0ad2aa
 for display
f0ad2aa
f0ad2aa
In some cases attempting to display arbitrary binary strings leads
f0ad2aa
to ASAN splats reading the widthspec array out of bounds.
f0ad2aa
f0ad2aa
Check the index. If it would be out of bounds, return a width of 1.
f0ad2aa
I don't know if that's strictly correct, but we're not really expecting
f0ad2aa
great display of arbitrary binary data, and it's certainly not worse than
f0ad2aa
an OOB read.
f0ad2aa
f0ad2aa
Signed-off-by: Daniel Axtens <dja@axtens.net>
f0ad2aa
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
f0ad2aa
(cherry picked from commit fdf32abc7a3928852422c0f291d8cd1dd6b34a8d)
f0ad2aa
---
f0ad2aa
 grub-core/normal/charset.c | 2 ++
f0ad2aa
 1 file changed, 2 insertions(+)
f0ad2aa
f0ad2aa
diff --git a/grub-core/normal/charset.c b/grub-core/normal/charset.c
f0ad2aa
index 4dfcc31078..7a5a7c153c 100644
f0ad2aa
--- a/grub-core/normal/charset.c
f0ad2aa
+++ b/grub-core/normal/charset.c
f0ad2aa
@@ -395,6 +395,8 @@ grub_unicode_estimate_width (const struct grub_unicode_glyph *c)
f0ad2aa
 {
f0ad2aa
   if (grub_unicode_get_comb_type (c->base))
f0ad2aa
     return 0;
f0ad2aa
+  if (((unsigned long) (c->base >> 3)) >= ARRAY_SIZE (widthspec))
f0ad2aa
+    return 1;
f0ad2aa
   if (widthspec[c->base >> 3] & (1 << (c->base & 7)))
f0ad2aa
     return 2;
f0ad2aa
   else