Clean up kbdioctl():

* Make sure all uses of the data pointer are type-cast appropriately.
* Eliminate the super-user check in the KIOCSKEY case (back as it was).
* Return ENOTTY if the ioctl command code is unrecognized.
This commit is contained in:
gwr 1997-10-21 15:17:31 +00:00
parent b021feb71d
commit 0889565499
1 changed files with 11 additions and 17 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: kbd.c,v 1.15 1997/10/03 23:04:46 gwr Exp $ */ /* $NetBSD: kbd.c,v 1.16 1997/10/21 15:17:31 gwr Exp $ */
/* /*
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
@ -399,7 +399,6 @@ kbdioctl(dev, cmd, data, flag, p)
{ {
struct kbd_softc *k; struct kbd_softc *k;
struct kbd_state *ks; struct kbd_state *ks;
int *ip;
int error = 0; int error = 0;
k = kbd_cd.cd_devs[minor(dev)]; k = kbd_cd.cd_devs[minor(dev)];
@ -408,16 +407,14 @@ kbdioctl(dev, cmd, data, flag, p)
switch (cmd) { switch (cmd) {
case KIOCTRANS: /* Set translation mode */ case KIOCTRANS: /* Set translation mode */
ip = (int *)data;
/* We only support "raw" mode on /dev/kbd */ /* We only support "raw" mode on /dev/kbd */
if (*ip != TR_UNTRANS_EVENT) if (*(int *)data != TR_UNTRANS_EVENT)
error = EINVAL; error = EINVAL;
break; break;
case KIOCGTRANS: /* Get translation mode */ case KIOCGTRANS: /* Get translation mode */
ip = (int *)data;
/* We only support "raw" mode on /dev/kbd */ /* We only support "raw" mode on /dev/kbd */
*ip = TR_UNTRANS_EVENT; *(int *)data = TR_UNTRANS_EVENT;
break; break;
#ifdef KIOCGETKEY #ifdef KIOCGETKEY
@ -427,30 +424,25 @@ kbdioctl(dev, cmd, data, flag, p)
#endif KIOCGETKEY */ #endif KIOCGETKEY */
case KIOCSKEY: /* Set keymap entry */ case KIOCSKEY: /* Set keymap entry */
/* Don't let just anyone hose the keyboard. */
if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
return (error);
/* fallthrough */ /* fallthrough */
case KIOCGKEY: /* Get keymap entry */ case KIOCGKEY: /* Get keymap entry */
error = kbd_iockeymap(ks, cmd, (struct kiockeymap *)data); error = kbd_iockeymap(ks, cmd, (struct kiockeymap *)data);
break; break;
case KIOCCMD: /* Send a command to the keyboard */ case KIOCCMD: /* Send a command to the keyboard */
error = kbd_docmd(*((int *)data), 1); error = kbd_docmd(*(int *)data, 1);
break; break;
case KIOCTYPE: /* Get keyboard type */ case KIOCTYPE: /* Get keyboard type */
ip = (int *)data; *(int *)data = ks->kbd_id;
*ip = ks->kbd_id;
break; break;
case KIOCSDIRECT: /* where to send input */ case KIOCSDIRECT: /* where to send input */
ip = (int *)data; k->k_evmode = *(int *)data;
k->k_evmode = *ip;
break; break;
case KIOCLAYOUT: /* Get keyboard layout */ case KIOCLAYOUT: /* Get keyboard layout */
*data = ks->kbd_layout; *(int *)data = ks->kbd_layout;
break; break;
case KIOCSLED: case KIOCSLED:
@ -469,11 +461,13 @@ kbdioctl(dev, cmd, data, flag, p)
break; break;
case TIOCSPGRP: case TIOCSPGRP:
ip = (int *)data; if (*(int *)data != k->k_events.ev_io->p_pgid)
if (*ip != k->k_events.ev_io->p_pgid)
error = EPERM; error = EPERM;
break; break;
default:
error = ENOTTY;
break;
} }
return (error); return (error);