mirror of https://gitee.com/openkylin/linux.git
x86 setup: sizeof() is unsigned, unbreak comparisons
We use signed values for limit checking since the values can go negative under certain circumstances. However, sizeof() is unsigned and forces the comparison to be unsigned, so move the comparison into the heap_free() macros so we can ensure it is a signed comparison. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
6b6815c6d5
commit
e6e1ace990
|
@ -216,9 +216,9 @@ static inline char *__get_heap(size_t s, size_t a, size_t n)
|
||||||
#define GET_HEAP(type, n) \
|
#define GET_HEAP(type, n) \
|
||||||
((type *)__get_heap(sizeof(type),__alignof__(type),(n)))
|
((type *)__get_heap(sizeof(type),__alignof__(type),(n)))
|
||||||
|
|
||||||
static inline int heap_free(void)
|
static inline bool heap_free(size_t n)
|
||||||
{
|
{
|
||||||
return heap_end-HEAP;
|
return (int)(heap_end-HEAP) >= (int)n;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy.S */
|
/* copy.S */
|
||||||
|
|
|
@ -79,7 +79,7 @@ static int bios_probe(void)
|
||||||
video_bios.modes = GET_HEAP(struct mode_info, 0);
|
video_bios.modes = GET_HEAP(struct mode_info, 0);
|
||||||
|
|
||||||
for (mode = 0x14; mode <= 0x7f; mode++) {
|
for (mode = 0x14; mode <= 0x7f; mode++) {
|
||||||
if (heap_free() < sizeof(struct mode_info))
|
if (!heap_free(sizeof(struct mode_info)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (mode_defined(VIDEO_FIRST_BIOS+mode))
|
if (mode_defined(VIDEO_FIRST_BIOS+mode))
|
||||||
|
|
|
@ -57,7 +57,7 @@ static int vesa_probe(void)
|
||||||
while ((mode = rdfs16(mode_ptr)) != 0xffff) {
|
while ((mode = rdfs16(mode_ptr)) != 0xffff) {
|
||||||
mode_ptr += 2;
|
mode_ptr += 2;
|
||||||
|
|
||||||
if (heap_free() < sizeof(struct mode_info))
|
if (!heap_free(sizeof(struct mode_info)))
|
||||||
break; /* Heap full, can't save mode info */
|
break; /* Heap full, can't save mode info */
|
||||||
|
|
||||||
if (mode & ~0x1ff)
|
if (mode & ~0x1ff)
|
||||||
|
|
|
@ -371,7 +371,7 @@ static void save_screen(void)
|
||||||
saved.curx = boot_params.screen_info.orig_x;
|
saved.curx = boot_params.screen_info.orig_x;
|
||||||
saved.cury = boot_params.screen_info.orig_y;
|
saved.cury = boot_params.screen_info.orig_y;
|
||||||
|
|
||||||
if (heap_free() < saved.x*saved.y*sizeof(u16)+512)
|
if (!heap_free(saved.x*saved.y*sizeof(u16)+512))
|
||||||
return; /* Not enough heap to save the screen */
|
return; /* Not enough heap to save the screen */
|
||||||
|
|
||||||
saved.data = GET_HEAP(u16, saved.x*saved.y);
|
saved.data = GET_HEAP(u16, saved.x*saved.y);
|
||||||
|
|
Loading…
Reference in New Issue