Commit c396a5bf authored by Kees Cook's avatar Kees Cook Committed by Greg Kroah-Hartman

console: Expand dummy functions for CFI

This expands the no-op dummy functions into full prototypes to avoid
indirect call mismatches when running under Control Flow Integrity
checking, like with Clang's -fsanitize=cfi.
Co-Developed-by: default avatarSami Tolvanen <samitolvanen@google.com>
Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 209f668c
...@@ -1217,7 +1217,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot, ...@@ -1217,7 +1217,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot,
/* Interface routine */ /* Interface routine */
static int static int
sisusbcon_font_set(struct vc_data *c, struct console_font *font, sisusbcon_font_set(struct vc_data *c, struct console_font *font,
unsigned flags) unsigned int flags)
{ {
struct sisusb_usb_data *sisusb; struct sisusb_usb_data *sisusb;
unsigned charcount = font->charcount; unsigned charcount = font->charcount;
...@@ -1338,28 +1338,65 @@ static void sisusbdummycon_init(struct vc_data *vc, int init) ...@@ -1338,28 +1338,65 @@ static void sisusbdummycon_init(struct vc_data *vc, int init)
vc_resize(vc, 80, 25); vc_resize(vc, 80, 25);
} }
static int sisusbdummycon_dummy(void) static void sisusbdummycon_deinit(struct vc_data *vc) { }
static void sisusbdummycon_clear(struct vc_data *vc, int sy, int sx,
int height, int width) { }
static void sisusbdummycon_putc(struct vc_data *vc, int c, int ypos,
int xpos) { }
static void sisusbdummycon_putcs(struct vc_data *vc, const unsigned short *s,
int count, int ypos, int xpos) { }
static void sisusbdummycon_cursor(struct vc_data *vc, int mode) { }
static bool sisusbdummycon_scroll(struct vc_data *vc, unsigned int top,
unsigned int bottom, enum con_scroll dir,
unsigned int lines)
{
return false;
}
static int sisusbdummycon_switch(struct vc_data *vc)
{
return 0;
}
static int sisusbdummycon_blank(struct vc_data *vc, int blank, int mode_switch)
{
return 0;
}
static int sisusbdummycon_font_set(struct vc_data *vc,
struct console_font *font,
unsigned int flags)
{
return 0;
}
static int sisusbdummycon_font_default(struct vc_data *vc,
struct console_font *font, char *name)
{ {
return 0; return 0;
} }
#define SISUSBCONDUMMY (void *)sisusbdummycon_dummy static int sisusbdummycon_font_copy(struct vc_data *vc, int con)
{
return 0;
}
static const struct consw sisusb_dummy_con = { static const struct consw sisusb_dummy_con = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.con_startup = sisusbdummycon_startup, .con_startup = sisusbdummycon_startup,
.con_init = sisusbdummycon_init, .con_init = sisusbdummycon_init,
.con_deinit = SISUSBCONDUMMY, .con_deinit = sisusbdummycon_deinit,
.con_clear = SISUSBCONDUMMY, .con_clear = sisusbdummycon_clear,
.con_putc = SISUSBCONDUMMY, .con_putc = sisusbdummycon_putc,
.con_putcs = SISUSBCONDUMMY, .con_putcs = sisusbdummycon_putcs,
.con_cursor = SISUSBCONDUMMY, .con_cursor = sisusbdummycon_cursor,
.con_scroll = SISUSBCONDUMMY, .con_scroll = sisusbdummycon_scroll,
.con_switch = SISUSBCONDUMMY, .con_switch = sisusbdummycon_switch,
.con_blank = SISUSBCONDUMMY, .con_blank = sisusbdummycon_blank,
.con_font_set = SISUSBCONDUMMY, .con_font_set = sisusbdummycon_font_set,
.con_font_default = SISUSBCONDUMMY, .con_font_default = sisusbdummycon_font_default,
.con_font_copy = SISUSBCONDUMMY, .con_font_copy = sisusbdummycon_font_copy,
}; };
int int
......
...@@ -41,12 +41,47 @@ static void dummycon_init(struct vc_data *vc, int init) ...@@ -41,12 +41,47 @@ static void dummycon_init(struct vc_data *vc, int init)
vc_resize(vc, DUMMY_COLUMNS, DUMMY_ROWS); vc_resize(vc, DUMMY_COLUMNS, DUMMY_ROWS);
} }
static int dummycon_dummy(void) static void dummycon_deinit(struct vc_data *vc) { }
static void dummycon_clear(struct vc_data *vc, int sy, int sx, int height,
int width) { }
static void dummycon_putc(struct vc_data *vc, int c, int ypos, int xpos) { }
static void dummycon_putcs(struct vc_data *vc, const unsigned short *s,
int count, int ypos, int xpos) { }
static void dummycon_cursor(struct vc_data *vc, int mode) { }
static bool dummycon_scroll(struct vc_data *vc, unsigned int top,
unsigned int bottom, enum con_scroll dir,
unsigned int lines)
{
return false;
}
static int dummycon_switch(struct vc_data *vc)
{
return 0;
}
static int dummycon_blank(struct vc_data *vc, int blank, int mode_switch)
{ {
return 0; return 0;
} }
#define DUMMY (void *)dummycon_dummy static int dummycon_font_set(struct vc_data *vc, struct console_font *font,
unsigned int flags)
{
return 0;
}
static int dummycon_font_default(struct vc_data *vc,
struct console_font *font, char *name)
{
return 0;
}
static int dummycon_font_copy(struct vc_data *vc, int con)
{
return 0;
}
/* /*
* The console `switch' structure for the dummy console * The console `switch' structure for the dummy console
...@@ -58,16 +93,16 @@ const struct consw dummy_con = { ...@@ -58,16 +93,16 @@ const struct consw dummy_con = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.con_startup = dummycon_startup, .con_startup = dummycon_startup,
.con_init = dummycon_init, .con_init = dummycon_init,
.con_deinit = DUMMY, .con_deinit = dummycon_deinit,
.con_clear = DUMMY, .con_clear = dummycon_clear,
.con_putc = DUMMY, .con_putc = dummycon_putc,
.con_putcs = DUMMY, .con_putcs = dummycon_putcs,
.con_cursor = DUMMY, .con_cursor = dummycon_cursor,
.con_scroll = DUMMY, .con_scroll = dummycon_scroll,
.con_switch = DUMMY, .con_switch = dummycon_switch,
.con_blank = DUMMY, .con_blank = dummycon_blank,
.con_font_set = DUMMY, .con_font_set = dummycon_font_set,
.con_font_default = DUMMY, .con_font_default = dummycon_font_default,
.con_font_copy = DUMMY, .con_font_copy = dummycon_font_copy,
}; };
EXPORT_SYMBOL_GPL(dummy_con); EXPORT_SYMBOL_GPL(dummy_con);
...@@ -673,14 +673,14 @@ static bool newport_scroll(struct vc_data *vc, unsigned int t, unsigned int b, ...@@ -673,14 +673,14 @@ static bool newport_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
return true; return true;
} }
static int newport_dummy(struct vc_data *c) static int newport_set_origin(struct vc_data *vc)
{ {
return 0; return 0;
} }
#define DUMMY (void *) newport_dummy static void newport_save_screen(struct vc_data *vc) { }
const struct consw newport_con = { static const struct consw newport_con = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.con_startup = newport_startup, .con_startup = newport_startup,
.con_init = newport_init, .con_init = newport_init,
...@@ -694,8 +694,8 @@ const struct consw newport_con = { ...@@ -694,8 +694,8 @@ const struct consw newport_con = {
.con_blank = newport_blank, .con_blank = newport_blank,
.con_font_set = newport_font_set, .con_font_set = newport_font_set,
.con_font_default = newport_font_default, .con_font_default = newport_font_default,
.con_set_origin = DUMMY, .con_set_origin = newport_set_origin,
.con_save_screen = DUMMY .con_save_screen = newport_save_screen
}; };
static int newport_probe(struct gio_device *dev, static int newport_probe(struct gio_device *dev,
......
...@@ -1272,7 +1272,8 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight) ...@@ -1272,7 +1272,8 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight)
return 0; return 0;
} }
static int vgacon_font_set(struct vc_data *c, struct console_font *font, unsigned flags) static int vgacon_font_set(struct vc_data *c, struct console_font *font,
unsigned int flags)
{ {
unsigned charcount = font->charcount; unsigned charcount = font->charcount;
int rc; int rc;
...@@ -1407,21 +1408,20 @@ static bool vgacon_scroll(struct vc_data *c, unsigned int t, unsigned int b, ...@@ -1407,21 +1408,20 @@ static bool vgacon_scroll(struct vc_data *c, unsigned int t, unsigned int b,
* The console `switch' structure for the VGA based console * The console `switch' structure for the VGA based console
*/ */
static int vgacon_dummy(struct vc_data *c) static void vgacon_clear(struct vc_data *vc, int sy, int sx, int height,
{ int width) { }
return 0; static void vgacon_putc(struct vc_data *vc, int c, int ypos, int xpos) { }
} static void vgacon_putcs(struct vc_data *vc, const unsigned short *s,
int count, int ypos, int xpos) { }
#define DUMMY (void *) vgacon_dummy
const struct consw vga_con = { const struct consw vga_con = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.con_startup = vgacon_startup, .con_startup = vgacon_startup,
.con_init = vgacon_init, .con_init = vgacon_init,
.con_deinit = vgacon_deinit, .con_deinit = vgacon_deinit,
.con_clear = DUMMY, .con_clear = vgacon_clear,
.con_putc = DUMMY, .con_putc = vgacon_putc,
.con_putcs = DUMMY, .con_putcs = vgacon_putcs,
.con_cursor = vgacon_cursor, .con_cursor = vgacon_cursor,
.con_scroll = vgacon_scroll, .con_scroll = vgacon_scroll,
.con_switch = vgacon_switch, .con_switch = vgacon_switch,
......
...@@ -2595,7 +2595,8 @@ static int fbcon_copy_font(struct vc_data *vc, int con) ...@@ -2595,7 +2595,8 @@ static int fbcon_copy_font(struct vc_data *vc, int con)
* is ever implemented. * is ever implemented.
*/ */
static int fbcon_set_font(struct vc_data *vc, struct console_font *font, unsigned flags) static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
unsigned int flags)
{ {
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
unsigned charcount = font->charcount; unsigned charcount = font->charcount;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment