From a4b05bb1936d15d0dd7ee482b7ce7dd4766a6988 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Mon, 29 Dec 2003 05:53:02 -0800 Subject: [PATCH] [PATCH] Allow unimap change on non fg console From: Kurt Garloff The comment in front of vt_ioctl() reads /* * We handle the console-specific ioctl's here. We allow the * capability to modify any console, not just the fg_console.=20 */ Unfortunately, this does not apply to PIO_UNIMAPCLR, nor GIO_/PIO_UNIMAP. They always operate on the current foreground console, which is inconsistent at least. For most ioctls, the comment is applicable. It also causes problems, as setfont can't do the full job on the non-fg consoles. (OK, our setfont is slightly changed to even try it ... as you know.) The attached patch does fix this. I have a similar patch for 2.4, but it never got merged :-( because not many people seem to care and I submitted in the middle of the 2.4 series ... It has been in UnitedLinux/SUSE kernels for ages, though. --- drivers/char/vt_ioctl.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c index ca817c0758ad5..1412a620432d7 100644 --- a/drivers/char/vt_ioctl.c +++ b/drivers/char/vt_ioctl.c @@ -332,7 +332,7 @@ do_fontx_ioctl(int cmd, struct consolefontdesc *user_cfd, int perm, struct conso } static inline int -do_unimap_ioctl(int cmd, struct unimapdesc *user_ud,int perm) +do_unimap_ioctl(int cmd, struct unimapdesc *user_ud, int perm, unsigned int console) { struct unimapdesc tmp; int i = 0; @@ -348,9 +348,11 @@ do_unimap_ioctl(int cmd, struct unimapdesc *user_ud,int perm) case PIO_UNIMAP: if (!perm) return -EPERM; - return con_set_unimap(fg_console, tmp.entry_ct, tmp.entries); + return con_set_unimap(console, tmp.entry_ct, tmp.entries); case GIO_UNIMAP: - return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries); + if (!perm && fg_console != console) + return -EPERM; + return con_get_unimap(console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries); } return 0; } @@ -966,13 +968,13 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, return -EPERM; i = copy_from_user(&ui, (void *)arg, sizeof(struct unimapinit)); if (i) return -EFAULT; - con_clear_unimap(fg_console, &ui); + con_clear_unimap(console, &ui); return 0; } case PIO_UNIMAP: case GIO_UNIMAP: - return do_unimap_ioctl(cmd, (struct unimapdesc *)arg, perm); + return do_unimap_ioctl(cmd, (struct unimapdesc *)arg, perm, console); case VT_LOCKSWITCH: if (!capable(CAP_SYS_TTY_CONFIG)) -- 2.53.0