This time, really fix endian bugs accessing ioctl arguments that

are passed by value.  These are KDSKBMODE, KDSETLED, KDSKBSTATE,
and KDSETRAD.

Tested on:	amd64, sparc64 (demo code)
This commit is contained in:
Ruslan Ermilov 2006-09-19 13:01:20 +00:00
parent 5fd885b07b
commit 9cd96497d6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=162440

View File

@ -1051,7 +1051,7 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
case KDSKBMODE: /* set keyboard mode */
KBDMUX_LOCK(state);
switch (*((int *) arg)) {
switch ((int)*(intptr_t *)arg) {
case K_XLATE:
if (state->ks_mode != K_XLATE) {
/* make lock key state and LED state match */
@ -1062,9 +1062,9 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
case K_RAW:
case K_CODE:
if (state->ks_mode != *((int *) arg)) {
if (state->ks_mode != (int)*(intptr_t *)arg) {
kbdmux_clear_state_locked(state);
state->ks_mode = *((int *) arg);
state->ks_mode = (int)*(intptr_t *)arg;
}
break;
@ -1086,13 +1086,13 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
KBDMUX_LOCK(state);
/* NOTE: lock key state in ks_state won't be changed */
if (*((int *) arg) & ~LOCK_MASK) {
if ((int)*(intptr_t *)arg & ~LOCK_MASK) {
KBDMUX_UNLOCK(state);
return (EINVAL);
}
KBD_LED_VAL(kbd) = *((int *) arg);
KBD_LED_VAL(kbd) = (int)*(intptr_t *)arg;
/* KDSETLED on all slave keyboards */
SLIST_FOREACH(k, &state->ks_kbds, next)
@ -1110,14 +1110,14 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
case KDSKBSTATE: /* set lock key state */
KBDMUX_LOCK(state);
if (*((int *) arg) & ~LOCK_MASK) {
if ((int)*(intptr_t *)arg & ~LOCK_MASK) {
KBDMUX_UNLOCK(state);
return (EINVAL);
}
state->ks_state &= ~LOCK_MASK;
state->ks_state |= *((int *) arg);
state->ks_state |= (int)*(intptr_t *)arg;
/* KDSKBSTATE on all slave keyboards */
SLIST_FOREACH(k, &state->ks_kbds, next)
@ -1147,7 +1147,7 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
break;
mode |= i;
} else
mode = *((int *) arg);
mode = (int)*(intptr_t *)arg;
if (mode & ~0x7f) {
KBDMUX_UNLOCK(state);