video/fb/fbfill: Use unsigned integers for width/height
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>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
406dde6f27
commit
e48fc8880d
@ -38,10 +38,9 @@
|
||||
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, j;
|
||||
|
||||
for (j = 0; j < height; j++)
|
||||
for (i = 0; i < width; i++)
|
||||
@ -53,10 +52,9 @@ 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, j;
|
||||
grub_uint32_t *dstptr;
|
||||
grub_size_t rowskip;
|
||||
|
||||
@ -84,10 +82,9 @@ 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, j;
|
||||
grub_size_t rowskip;
|
||||
grub_uint8_t *dstptr;
|
||||
#ifndef GRUB_CPU_WORDS_BIGENDIAN
|
||||
@ -127,10 +124,9 @@ 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, j;
|
||||
grub_size_t rowskip;
|
||||
grub_uint16_t *dstptr;
|
||||
|
||||
@ -158,10 +154,9 @@ 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, j;
|
||||
grub_size_t rowskip;
|
||||
grub_uint8_t *dstptr;
|
||||
grub_uint8_t fill = (grub_uint8_t)color & 0xFF;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user