Skip to content

Commit 05e2600

Browse files
sthibaulgregkh
authored andcommitted
VT: Bump font size limitation to 64x128 pixels
This moves 32x32 font size limitation checking down to drivers, so that fbcon can allow large fonts. We still keep a limitation to 64x128 pixels so as to have a simple bounded allocation for con_font_get and in the userland kbd tool. That glyph size will however be enough to have 128x36 characters on a "16/9 8K display". Signed-off-by: Samuel Thibault <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 24d6938 commit 05e2600

File tree

3 files changed

+19
-13
lines changed

3 files changed

+19
-13
lines changed

drivers/tty/vt/vt.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4523,17 +4523,20 @@ void reset_palette(struct vc_data *vc)
45234523
/*
45244524
* Font switching
45254525
*
4526-
* Currently we only support fonts up to 32 pixels wide, at a maximum height
4527-
* of 32 pixels. Userspace fontdata is stored with 32 bytes (shorts/ints,
4528-
* depending on width) reserved for each character which is kinda wasty, but
4529-
* this is done in order to maintain compatibility with the EGA/VGA fonts. It
4530-
* is up to the actual low-level console-driver convert data into its favorite
4531-
* format (maybe we should add a `fontoffset' field to the `display'
4532-
* structure so we won't have to convert the fontdata all the time.
4526+
* Currently we only support fonts up to 128 pixels wide, at a maximum height
4527+
* of 128 pixels. Userspace fontdata may have to be stored with 32 bytes
4528+
* (shorts/ints, depending on width) reserved for each character which is
4529+
* kinda wasty, but this is done in order to maintain compatibility with the
4530+
* EGA/VGA fonts. It is up to the actual low-level console-driver convert data
4531+
* into its favorite format (maybe we should add a `fontoffset' field to the
4532+
* `display' structure so we won't have to convert the fontdata all the time.
45334533
* /Jes
45344534
*/
45354535

4536-
#define max_font_size 65536
4536+
#define max_font_width 64
4537+
#define max_font_height 128
4538+
#define max_font_glyphs 512
4539+
#define max_font_size (max_font_glyphs*max_font_width*max_font_height)
45374540

45384541
static int con_font_get(struct vc_data *vc, struct console_font_op *op)
45394542
{
@@ -4543,7 +4546,7 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op)
45434546
unsigned int vpitch = op->op == KD_FONT_OP_GET_TALL ? op->height : 32;
45444547

45454548
if (op->data) {
4546-
font.data = kmalloc(max_font_size, GFP_KERNEL);
4549+
font.data = kvmalloc(max_font_size, GFP_KERNEL);
45474550
if (!font.data)
45484551
return -ENOMEM;
45494552
} else
@@ -4578,7 +4581,7 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op)
45784581
rc = -EFAULT;
45794582

45804583
out:
4581-
kfree(font.data);
4584+
kvfree(font.data);
45824585
return rc;
45834586
}
45844587

@@ -4593,9 +4596,10 @@ static int con_font_set(struct vc_data *vc, struct console_font_op *op)
45934596
return -EINVAL;
45944597
if (!op->data)
45954598
return -EINVAL;
4596-
if (op->charcount > 512)
4599+
if (op->charcount > max_font_glyphs)
45974600
return -EINVAL;
4598-
if (op->width <= 0 || op->width > 32 || !op->height || op->height > 32)
4601+
if (op->width <= 0 || op->width > max_font_width || !op->height ||
4602+
op->height > max_font_height)
45994603
return -EINVAL;
46004604
if (vpitch < op->height)
46014605
return -EINVAL;

drivers/video/console/vgacon.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,7 @@ static int vgacon_font_set(struct vc_data *c, struct console_font *font,
10371037
if (vga_video_type < VIDEO_TYPE_EGAM)
10381038
return -EINVAL;
10391039

1040-
if (font->width != VGA_FONTWIDTH || vpitch != 32 ||
1040+
if (font->width != VGA_FONTWIDTH || font->height > 32 || vpitch != 32 ||
10411041
(charcount != 256 && charcount != 512))
10421042
return -EINVAL;
10431043

drivers/video/fbdev/core/fbcon.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2279,6 +2279,8 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font, unsigne
22792279

22802280
font->width = vc->vc_font.width;
22812281
font->height = vc->vc_font.height;
2282+
if (font->height > vpitch)
2283+
return -ENOSPC;
22822284
font->charcount = vc->vc_hi_font_mask ? 512 : 256;
22832285
if (!font->data)
22842286
return 0;

0 commit comments

Comments
 (0)