Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b73deed3 authored by Antonino A. Daplas's avatar Antonino A. Daplas Committed by Linus Torvalds
Browse files

[PATCH] fbcon: Sanitize fbcon



Do not pass the structure display since fbcon is already keeping the pointer
to the current display.

Signed-off-by: default avatarAntonino Daplas <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 8416131d
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -234,14 +234,14 @@ static void bit_clear_margins(struct vc_data *vc, struct fb_info *info,
	}
}

static void bit_cursor(struct vc_data *vc, struct fb_info *info,
		       struct display *p, int mode, int softback_lines, int fg, int bg)
static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
		       int softback_lines, int fg, int bg)
{
	struct fb_cursor cursor;
	struct fbcon_ops *ops = (struct fbcon_ops *) info->fbcon_par;
	struct fbcon_ops *ops = info->fbcon_par;
	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
	int w = (vc->vc_font.width + 7) >> 3, c;
	int y = real_y(p, vc->vc_y);
	int y = real_y(ops->p, vc->vc_y);
	int attribute, use_sw = (vc->vc_cursor_type & 0x10);
	int err = 1;
	char *src;
@@ -310,7 +310,7 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info,
	}

	if (cursor.set & FB_CUR_SETSIZE ||
	    vc->vc_cursor_type != p->cursor_shape ||
	    vc->vc_cursor_type != ops->p->cursor_shape ||
	    ops->cursor_state.mask == NULL ||
	    ops->cursor_reset) {
		char *mask = kmalloc(w*vc->vc_font.height, GFP_ATOMIC);
@@ -323,10 +323,10 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info,
		kfree(ops->cursor_state.mask);
		ops->cursor_state.mask = mask;

		p->cursor_shape = vc->vc_cursor_type;
		ops->p->cursor_shape = vc->vc_cursor_type;
		cursor.set |= FB_CUR_SETSHAPE;

		switch (p->cursor_shape & CUR_HWMASK) {
		switch (ops->p->cursor_shape & CUR_HWMASK) {
		case CUR_NONE:
			cur_height = 0;
			break;
+23 −26
Original line number Diff line number Diff line
@@ -209,13 +209,13 @@ static irqreturn_t fb_vbl_detect(int irq, void *dummy, struct pt_regs *fp)
#endif

#ifdef CONFIG_FRAMEBUFFER_CONSOLE_ROTATION
static inline void fbcon_set_rotation(struct fb_info *info, struct display *p)
static inline void fbcon_set_rotation(struct fb_info *info)
{
	struct fbcon_ops *ops = info->fbcon_par;

	if (!(info->flags & FBINFO_MISC_TILEBLITTING) &&
	    p->con_rotate < 4)
		ops->rotate = p->con_rotate;
	    ops->p->con_rotate < 4)
		ops->rotate = ops->p->con_rotate;
	else
		ops->rotate = 0;
}
@@ -265,7 +265,7 @@ static void fbcon_rotate_all(struct fb_info *info, u32 rotate)
	fbcon_set_all_vcs(info);
}
#else
static inline void fbcon_set_rotation(struct fb_info *info, struct display *p)
static inline void fbcon_set_rotation(struct fb_info *info)
{
	struct fbcon_ops *ops = info->fbcon_par;

@@ -402,7 +402,7 @@ static void fb_flashcursor(void *private)
	c = scr_readw((u16 *) vc->vc_pos);
	mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
		CM_ERASE : CM_DRAW;
	ops->cursor(vc, info, p, mode, softback_lines, get_color(vc, info, c, 1),
	ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),
		    get_color(vc, info, c, 0));
	release_console_sem();
}
@@ -647,29 +647,27 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
}

#ifdef CONFIG_FB_TILEBLITTING
static void set_blitting_type(struct vc_data *vc, struct fb_info *info,
			      struct display *p)
static void set_blitting_type(struct vc_data *vc, struct fb_info *info)
{
	struct fbcon_ops *ops = info->fbcon_par;

	ops->p = (p) ? p : &fb_display[vc->vc_num];
	ops->p = &fb_display[vc->vc_num];

	if ((info->flags & FBINFO_MISC_TILEBLITTING))
		fbcon_set_tileops(vc, info, p, ops);
		fbcon_set_tileops(vc, info);
	else {
		fbcon_set_rotation(info, ops->p);
		fbcon_set_rotation(info);
		fbcon_set_bitops(ops);
	}
}
#else
static void set_blitting_type(struct vc_data *vc, struct fb_info *info,
			      struct display *p)
static void set_blitting_type(struct vc_data *vc, struct fb_info *info)
{
	struct fbcon_ops *ops = info->fbcon_par;

	info->flags &= ~FBINFO_MISC_TILEBLITTING;
	ops->p = (p) ? p : &fb_display[vc->vc_num];
	fbcon_set_rotation(info, ops->p);
	ops->p = &fb_display[vc->vc_num];
	fbcon_set_rotation(info);
	fbcon_set_bitops(ops);
}
#endif /* CONFIG_MISC_TILEBLITTING */
@@ -697,7 +695,7 @@ static int con2fb_acquire_newinfo(struct vc_data *vc, struct fb_info *info,
	if (!err) {
		memset(ops, 0, sizeof(struct fbcon_ops));
		info->fbcon_par = ops;
		set_blitting_type(vc, info, NULL);
		set_blitting_type(vc, info);
	}

	if (err) {
@@ -933,7 +931,7 @@ static const char *fbcon_startup(void)
	ops->cur_rotate = -1;
	info->fbcon_par = ops;
	p->con_rotate = rotate;
	set_blitting_type(vc, info, NULL);
	set_blitting_type(vc, info);

	if (info->fix.type != FB_TYPE_TEXT) {
		if (fbcon_softback_size) {
@@ -1093,7 +1091,7 @@ static void fbcon_init(struct vc_data *vc, int init)

	ops = info->fbcon_par;
	p->con_rotate = rotate;
	set_blitting_type(vc, info, NULL);
	set_blitting_type(vc, info);

	cols = vc->vc_cols;
	rows = vc->vc_rows;
@@ -1141,9 +1139,9 @@ static void fbcon_init(struct vc_data *vc, int init)
	if (vc == svc && softback_buf)
		fbcon_update_softback(vc);

	if (ops->rotate_font && ops->rotate_font(info, vc, p)) {
	if (ops->rotate_font && ops->rotate_font(info, vc)) {
		ops->rotate = FB_ROTATE_UR;
		set_blitting_type(vc, info, p);
		set_blitting_type(vc, info);
	}

}
@@ -1243,7 +1241,6 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
{
	struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
	struct fbcon_ops *ops = info->fbcon_par;
	struct display *p = &fb_display[vc->vc_num];
	int y;
 	int c = scr_readw((u16 *) vc->vc_pos);

@@ -1260,7 +1257,7 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
		y = 0;
	}

	ops->cursor(vc, info, p, mode, y, get_color(vc, info, c, 1),
	ops->cursor(vc, info, mode, y, get_color(vc, info, c, 1),
		    get_color(vc, info, c, 0));
	vbl_cursor_cnt = CURSOR_DRAW_DELAY;
}
@@ -2111,12 +2108,12 @@ static int fbcon_switch(struct vc_data *vc)
		fbcon_add_cursor_timer(info);
	}

	set_blitting_type(vc, info, p);
	set_blitting_type(vc, info);
	ops->cursor_reset = 1;

	if (ops->rotate_font && ops->rotate_font(info, vc, p)) {
	if (ops->rotate_font && ops->rotate_font(info, vc)) {
		ops->rotate = FB_ROTATE_UR;
		set_blitting_type(vc, info, p);
		set_blitting_type(vc, info);
	}

	vc->vc_can_do_color = (fb_get_color_depth(&info->var, &info->fix)!=1);
@@ -2739,7 +2736,7 @@ static void fbcon_modechanged(struct fb_info *info)
		return;

	p = &fb_display[vc->vc_num];
	set_blitting_type(vc, info, p);
	set_blitting_type(vc, info);

	if (CON_IS_VISIBLE(vc)) {
		var_to_display(p, &info->var, info);
@@ -2781,7 +2778,7 @@ static void fbcon_set_all_vcs(struct fb_info *info)
			continue;

		p = &fb_display[vc->vc_num];
		set_blitting_type(vc, info, p);
		set_blitting_type(vc, info);
		var_to_display(p, &info->var, info);
		cols = FBCON_SWAP(ops->rotate, info->var.xres, info->var.yres);
		rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
+4 −7
Original line number Diff line number Diff line
@@ -62,12 +62,10 @@ struct fbcon_ops {
		      int fg, int bg);
	void (*clear_margins)(struct vc_data *vc, struct fb_info *info,
			      int bottom_only);
	void (*cursor)(struct vc_data *vc, struct fb_info *info,
		       struct display *p, int mode, int softback_lines,
		       int fg, int bg);
	void (*cursor)(struct vc_data *vc, struct fb_info *info, int mode,
		       int softback_lines, int fg, int bg);
	int  (*update_start)(struct fb_info *info);
	int  (*rotate_font)(struct fb_info *info, struct vc_data *vc,
			    struct display *p);
	int  (*rotate_font)(struct fb_info *info, struct vc_data *vc);
	struct fb_var_screeninfo var;  /* copy of the current fb_var_screeninfo */
	struct timer_list cursor_timer; /* Cursor timer */
	struct fb_cursor cursor_state;
@@ -173,8 +171,7 @@ struct fbcon_ops {
#define SCROLL_PAN_REDRAW  0x005

#ifdef CONFIG_FB_TILEBLITTING
extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info,
			      struct display *p, struct fbcon_ops *ops);
extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info);
#endif
extern void fbcon_set_bitops(struct fbcon_ops *ops);
extern int  soft_cursor(struct fb_info *info, struct fb_cursor *cursor);
+8 −9
Original line number Diff line number Diff line
@@ -219,19 +219,18 @@ static void ccw_clear_margins(struct vc_data *vc, struct fb_info *info,
	}
}

static void ccw_cursor(struct vc_data *vc, struct fb_info *info,
		      struct display *p, int mode, int softback_lines,
		      int fg, int bg)
static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
		       int softback_lines, int fg, int bg)
{
	struct fb_cursor cursor;
	struct fbcon_ops *ops = (struct fbcon_ops *) info->fbcon_par;
	struct fbcon_ops *ops = info->fbcon_par;
	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
	int w = (vc->vc_font.height + 7) >> 3, c;
	int y = real_y(p, vc->vc_y);
	int y = real_y(ops->p, vc->vc_y);
	int attribute, use_sw = (vc->vc_cursor_type & 0x10);
	int err = 1, dx, dy;
	char *src;
	u32 vyres = GETVYRES(p->scrollmode, info);
	u32 vyres = GETVYRES(ops->p->scrollmode, info);

	if (!ops->fontbuffer)
		return;
@@ -303,7 +302,7 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info,
	}

	if (cursor.set & FB_CUR_SETSIZE ||
	    vc->vc_cursor_type != p->cursor_shape ||
	    vc->vc_cursor_type != ops->p->cursor_shape ||
	    ops->cursor_state.mask == NULL ||
	    ops->cursor_reset) {
		char *tmp, *mask = kmalloc(w*vc->vc_font.width, GFP_ATOMIC);
@@ -323,10 +322,10 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info,
		kfree(ops->cursor_state.mask);
		ops->cursor_state.mask = mask;

		p->cursor_shape = vc->vc_cursor_type;
		ops->p->cursor_shape = vc->vc_cursor_type;
		cursor.set |= FB_CUR_SETSHAPE;

		switch (p->cursor_shape & CUR_HWMASK) {
		switch (ops->p->cursor_shape & CUR_HWMASK) {
		case CUR_NONE:
			cur_height = 0;
			break;
+8 −9
Original line number Diff line number Diff line
@@ -203,19 +203,18 @@ static void cw_clear_margins(struct vc_data *vc, struct fb_info *info,
	}
}

static void cw_cursor(struct vc_data *vc, struct fb_info *info,
		      struct display *p, int mode, int softback_lines,
		      int fg, int bg)
static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
		      int softback_lines, int fg, int bg)
{
	struct fb_cursor cursor;
	struct fbcon_ops *ops = (struct fbcon_ops *) info->fbcon_par;
	struct fbcon_ops *ops = info->fbcon_par;
	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
	int w = (vc->vc_font.height + 7) >> 3, c;
	int y = real_y(p, vc->vc_y);
	int y = real_y(ops->p, vc->vc_y);
	int attribute, use_sw = (vc->vc_cursor_type & 0x10);
	int err = 1, dx, dy;
	char *src;
	u32 vxres = GETVXRES(p->scrollmode, info);
	u32 vxres = GETVXRES(ops->p->scrollmode, info);

	if (!ops->fontbuffer)
		return;
@@ -287,7 +286,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info,
	}

	if (cursor.set & FB_CUR_SETSIZE ||
	    vc->vc_cursor_type != p->cursor_shape ||
	    vc->vc_cursor_type != ops->p->cursor_shape ||
	    ops->cursor_state.mask == NULL ||
	    ops->cursor_reset) {
		char *tmp, *mask = kmalloc(w*vc->vc_font.width, GFP_ATOMIC);
@@ -307,10 +306,10 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info,
		kfree(ops->cursor_state.mask);
		ops->cursor_state.mask = mask;

		p->cursor_shape = vc->vc_cursor_type;
		ops->p->cursor_shape = vc->vc_cursor_type;
		cursor.set |= FB_CUR_SETSHAPE;

		switch (p->cursor_shape & CUR_HWMASK) {
		switch (ops->p->cursor_shape & CUR_HWMASK) {
		case CUR_NONE:
			cur_height = 0;
			break;
Loading