diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c index e2a490c5ae08..7ad292df9ad1 100644 --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -1057,6 +1057,7 @@ static const char *fbcon_startup(void) vc->vc_font.width = font->width; vc->vc_font.height = font->height; vc->vc_font.data = (void *)(p->fontdata = font->data); + vc->vc_font.maxlen = font->maxlen; vc->vc_font.charcount = 256; /* FIXME Need to support more fonts */ } else { p->fontdata = vc->vc_font.data; @@ -1136,6 +1137,7 @@ static void fbcon_init(struct vc_data *vc, int init) vc->vc_font.width = font->width; vc->vc_font.height = font->height; vc->vc_font.data = (void *)(p->fontdata = font->data); + vc->vc_font.maxlen = font->maxlen; vc->vc_font.charcount = 256; /* FIXME Need to support more fonts */ } @@ -2471,6 +2473,9 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font) if (font->width <= 8) { j = vc->vc_font.height; + if (font->charcount * j > vc->vc_font.maxlen) + return 0; + for (i = 0; i < font->charcount; i++) { memcpy(data, fontdata, j); memset(data + j, 0, 32 - j); @@ -2479,6 +2484,9 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font) } } else if (font->width <= 16) { j = vc->vc_font.height * 2; + if (font->charcount * j > vc->vc_font.maxlen) + return 0; + for (i = 0; i < font->charcount; i++) { memcpy(data, fontdata, j); memset(data + j, 0, 64 - j); @@ -2486,6 +2494,9 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font) fontdata += j; } } else if (font->width <= 24) { + if (font->charcount * sizeof(u32) > vc->vc_font.maxlen) + return 0; + for (i = 0; i < font->charcount; i++) { for (j = 0; j < vc->vc_font.height; j++) { *data++ = fontdata[0]; @@ -2498,6 +2509,9 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font) } } else { j = vc->vc_font.height * 4; + if (font->charcount * j > vc->vc_font.maxlen) + return 0; + for (i = 0; i < font->charcount; i++) { memcpy(data, fontdata, j); memset(data + j, 0, 128 - j); @@ -2719,6 +2733,7 @@ static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font, cha font->width = f->width; font->height = f->height; + font->maxlen = f->maxlen; return fbcon_do_set_font(vc, f->width, f->height, f->data, 0); } diff --git a/include/linux/font.h b/include/linux/font.h index 51b91c8b69d5..4348dfc559d9 100644 --- a/include/linux/font.h +++ b/include/linux/font.h @@ -14,11 +14,12 @@ #include struct font_desc { - int idx; - const char *name; - int width, height; - const void *data; - int pref; + int idx; + const char *name; + int width, height; + const void *data; + int maxlen; + int pref; }; #define VGA8x8_IDX 0 diff --git a/include/uapi/linux/kd.h b/include/uapi/linux/kd.h index 4616b31f84da..fb2568661bea 100644 --- a/include/uapi/linux/kd.h +++ b/include/uapi/linux/kd.h @@ -168,6 +168,7 @@ struct console_font { unsigned int width, height; /* font size */ unsigned int charcount; unsigned char *data; /* font data with height fixed to 32 */ + unsigned int maxlen; }; #define KD_FONT_OP_SET 0 /* Set font */ diff --git a/lib/fonts/font_10x18.c b/lib/fonts/font_10x18.c index 532f0ff89a96..d7cfbbb6d24b 100644 --- a/lib/fonts/font_10x18.c +++ b/lib/fonts/font_10x18.c @@ -5139,6 +5139,7 @@ const struct font_desc font_10x18 = { .width = 10, .height = 18, .data = fontdata_10x18, + .maxlen = FONTDATAMAX, #ifdef __sparc__ .pref = 5, #else diff --git a/lib/fonts/font_6x10.c b/lib/fonts/font_6x10.c index 09b2cc03435b..81e5588c4177 100644 --- a/lib/fonts/font_6x10.c +++ b/lib/fonts/font_6x10.c @@ -1,7 +1,9 @@ // SPDX-License-Identifier: GPL-2.0 #include -static const unsigned char fontdata_6x10[] = { +#define FONTDATAMAX 2560 + +static const unsigned char fontdata_6x10[FONTDATAMAX] = { /* 0 0x00 '^@' */ 0x00, /* 00000000 */ @@ -3083,5 +3085,6 @@ const struct font_desc font_6x10 = { .width = 6, .height = 10, .data = fontdata_6x10, + .maxlen = FONTDATAMAX, .pref = 0, }; diff --git a/lib/fonts/font_6x11.c b/lib/fonts/font_6x11.c index d7136c33f1f0..5ed0cd89a96f 100644 --- a/lib/fonts/font_6x11.c +++ b/lib/fonts/font_6x11.c @@ -3348,6 +3348,7 @@ const struct font_desc font_vga_6x11 = { .width = 6, .height = 11, .data = fontdata_6x11, + .maxlen = FONTDATAMAX, /* Try avoiding this font if possible unless on MAC */ .pref = -2000, }; diff --git a/lib/fonts/font_7x14.c b/lib/fonts/font_7x14.c index 89752d0b23e8..bb23c7a4baea 100644 --- a/lib/fonts/font_7x14.c +++ b/lib/fonts/font_7x14.c @@ -4115,5 +4115,6 @@ const struct font_desc font_7x14 = { .width = 7, .height = 14, .data = fontdata_7x14, + .maxlen = FONTDATAMAX, .pref = 0, }; diff --git a/lib/fonts/font_8x16.c b/lib/fonts/font_8x16.c index b7ab1f5fbdb8..13ba6a07df16 100644 --- a/lib/fonts/font_8x16.c +++ b/lib/fonts/font_8x16.c @@ -4629,6 +4629,7 @@ const struct font_desc font_vga_8x16 = { .width = 8, .height = 16, .data = fontdata_8x16, + .maxlen = FONTDATAMAX, .pref = 0, }; EXPORT_SYMBOL(font_vga_8x16); diff --git a/lib/fonts/font_8x8.c b/lib/fonts/font_8x8.c index 2328ebc8bab5..d86acc151e7d 100644 --- a/lib/fonts/font_8x8.c +++ b/lib/fonts/font_8x8.c @@ -2580,5 +2580,6 @@ const struct font_desc font_vga_8x8 = { .width = 8, .height = 8, .data = fontdata_8x8, + .maxlen = FONTDATAMAX, .pref = 0, }; diff --git a/lib/fonts/font_acorn_8x8.c b/lib/fonts/font_acorn_8x8.c index 0ff0e85d4481..bb1b6fe6cae6 100644 --- a/lib/fonts/font_acorn_8x8.c +++ b/lib/fonts/font_acorn_8x8.c @@ -3,7 +3,9 @@ #include -static const unsigned char acorndata_8x8[] = { +#define FONTDATAMAX 2048 + +static const unsigned char acorndata_8x8[FONTDATAMAX] = { /* 00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ^@ */ /* 01 */ 0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e, /* ^A */ /* 02 */ 0x7e, 0xff, 0xbd, 0xff, 0xc3, 0xe7, 0xff, 0x7e, /* ^B */ @@ -268,6 +270,7 @@ const struct font_desc font_acorn_8x8 = { .width = 8, .height = 8, .data = acorndata_8x8, + .maxlen = FONTDATAMAX, #ifdef CONFIG_ARCH_ACORN .pref = 20, #else diff --git a/lib/fonts/font_mini_4x6.c b/lib/fonts/font_mini_4x6.c index 838caa1cfef7..6376fa6b9bd6 100644 --- a/lib/fonts/font_mini_4x6.c +++ b/lib/fonts/font_mini_4x6.c @@ -2153,6 +2153,7 @@ const struct font_desc font_mini_4x6 = { .width = 4, .height = 6, .data = fontdata_mini_4x6, + .maxlen = FONTDATAMAX, .pref = 3, }; diff --git a/lib/fonts/font_pearl_8x8.c b/lib/fonts/font_pearl_8x8.c index b15d3c342c5b..5f03f424275c 100644 --- a/lib/fonts/font_pearl_8x8.c +++ b/lib/fonts/font_pearl_8x8.c @@ -2584,5 +2584,6 @@ const struct font_desc font_pearl_8x8 = { .width = 8, .height = 8, .data = fontdata_pearl8x8, + .maxlen = FONTDATAMAX, .pref = 2, }; diff --git a/lib/fonts/font_sun12x22.c b/lib/fonts/font_sun12x22.c index 955d6eee3959..f630af4192b0 100644 --- a/lib/fonts/font_sun12x22.c +++ b/lib/fonts/font_sun12x22.c @@ -6158,6 +6158,7 @@ const struct font_desc font_sun_12x22 = { .width = 12, .height = 22, .data = fontdata_sun12x22, + .maxlen = FONTDATAMAX, #ifdef __sparc__ .pref = 5, #else diff --git a/lib/fonts/font_sun8x16.c b/lib/fonts/font_sun8x16.c index 03d71e53954a..9eed8f892d17 100644 --- a/lib/fonts/font_sun8x16.c +++ b/lib/fonts/font_sun8x16.c @@ -268,6 +268,7 @@ const struct font_desc font_sun_8x16 = { .width = 8, .height = 16, .data = fontdata_sun8x16, + .maxlen = FONTDATAMAX, #ifdef __sparc__ .pref = 10, #else diff --git a/lib/fonts/font_ter16x32.c b/lib/fonts/font_ter16x32.c index 3f0cf1ccdf3a..ca907f483cdb 100644 --- a/lib/fonts/font_ter16x32.c +++ b/lib/fonts/font_ter16x32.c @@ -2064,6 +2064,7 @@ const struct font_desc font_ter_16x32 = { .width = 16, .height = 32, .data = fontdata_ter16x32, + .maxlen = FONTDATAMAX, #ifdef __sparc__ .pref = 5, #else