grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH for 2.06] video/fbfill: use unsigned integers for width/height


From: Daniel Axtens
Subject: [PATCH for 2.06] video/fbfill: use unsigned integers for width/height
Date: Fri, 2 Apr 2021 02:22:04 +1100

Since commit 7ce3259f67ac ("video/fb/fbfill: Fix potential integer
overflow"), clang builds of grub-emu have failed with messages like:

/usr/bin/ld: libgrubmods.a(libgrubmods_a-fbfill.o): in function 
`grub_video_fbfill_direct24':
fbfill.c:(.text+0x28e): undefined reference to `__muloti4'

This appears to be due to a weird quirk in how clang compiles

  grub_mul (dst->mode_info->bytes_per_pixel, width, &rowskip)

which is grub_mul (unsigned int, int, &grub_size_t).

It looks like clang somewhere promotes everything to 128-bit maths
before ultimately reducing down to 64 bit for grub_size_t. I think
this is because width is signed, and indeed converting width to an
unsigned int makes the problem go away.

This conversion also makes more sense generally:
 - the caller of all the fbfill_directN functions is
   grub_video_fb_fill_dispatch and it takes width and height as
   unsigned ints already,
 - it doesn't make sense to fill a negative width or height.

Convert the width and height arguments and associated loop counters
to unsigned ints.

Fixes: 7ce3259f67ac ("video/fb/fbfill: Fix potential integer overflow")
Signed-off-by: Daniel Axtens <dja@axtens.net>

---

This should go in for 2.06, otherwise the Clang build will be broken.
---
 grub-core/video/fb/fbfill.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/grub-core/video/fb/fbfill.c b/grub-core/video/fb/fbfill.c
index a37acd1e2939..51b1f6557007 100644
--- a/grub-core/video/fb/fbfill.c
+++ b/grub-core/video/fb/fbfill.c
@@ -38,10 +38,10 @@
 static void
 grub_video_fbfill (struct grub_video_fbblit_info *dst,
                   grub_video_color_t color, int x, int y,
-                  int width, int height)
+                  unsigned int width, unsigned int height)
 {
-  int i;
-  int j;
+  unsigned int i;
+  unsigned int j;
 
   for (j = 0; j < height; j++)
     for (i = 0; i < width; i++)
@@ -53,10 +53,10 @@ grub_video_fbfill (struct grub_video_fbblit_info *dst,
 static void
 grub_video_fbfill_direct32 (struct grub_video_fbblit_info *dst,
                            grub_video_color_t color, int x, int y,
-                           int width, int height)
+                           unsigned int width, unsigned int height)
 {
-  int i;
-  int j;
+  unsigned int i;
+  unsigned int j;
   grub_uint32_t *dstptr;
   grub_size_t rowskip;
 
@@ -84,10 +84,10 @@ grub_video_fbfill_direct32 (struct grub_video_fbblit_info 
*dst,
 static void
 grub_video_fbfill_direct24 (struct grub_video_fbblit_info *dst,
                            grub_video_color_t color, int x, int y,
-                           int width, int height)
+                           unsigned int width, unsigned int height)
 {
-  int i;
-  int j;
+  unsigned int i;
+  unsigned int j;
   grub_size_t rowskip;
   grub_uint8_t *dstptr;
 #ifndef GRUB_CPU_WORDS_BIGENDIAN
@@ -127,10 +127,10 @@ grub_video_fbfill_direct24 (struct grub_video_fbblit_info 
*dst,
 static void
 grub_video_fbfill_direct16 (struct grub_video_fbblit_info *dst,
                            grub_video_color_t color, int x, int y,
-                           int width, int height)
+                           unsigned int width, unsigned int height)
 {
-  int i;
-  int j;
+  unsigned int i;
+  unsigned int j;
   grub_size_t rowskip;
   grub_uint16_t *dstptr;
 
@@ -158,10 +158,10 @@ grub_video_fbfill_direct16 (struct grub_video_fbblit_info 
*dst,
 static void
 grub_video_fbfill_direct8 (struct grub_video_fbblit_info *dst,
                           grub_video_color_t color, int x, int y,
-                          int width, int height)
+                          unsigned int width, unsigned int height)
 {
-  int i;
-  int j;
+  unsigned int i;
+  unsigned int j;
   grub_size_t rowskip;
   grub_uint8_t *dstptr;
   grub_uint8_t fill = (grub_uint8_t)color & 0xFF;
-- 
2.27.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]