X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fs390%2Fchar%2Fkeyboard.c;h=3e86fd1756e5dc5b43df29fb6c7fd480fd2160b4;hb=refs%2Fheads%2Fvserver;hp=5e35728db92e8feaa1a3b301a1b5903f9c9b4c7a;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c index 5e35728db..3e86fd175 100644 --- a/drivers/s390/char/keyboard.c +++ b/drivers/s390/char/keyboard.c @@ -7,7 +7,6 @@ * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), */ -#include #include #include #include @@ -32,11 +31,11 @@ static k_handler_fn K_HANDLERS; static k_handler_fn *k_handler[16] = { K_HANDLERS }; /* maximum values each key_handler can handle */ -static const int max_vals[] = { +static const int kbd_max_vals[] = { 255, ARRAY_SIZE(func_table) - 1, NR_FN_HANDLER - 1, 0, NR_DEAD - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static const int NR_TYPES = ARRAY_SIZE(max_vals); +static const int KBD_NR_TYPES = ARRAY_SIZE(kbd_max_vals); static unsigned char ret_diacr[NR_DEAD] = { '`', '\'', '^', '~', '"', ',' @@ -50,14 +49,12 @@ kbd_alloc(void) { struct kbd_data *kbd; int i, len; - kbd = kmalloc(sizeof(struct kbd_data), GFP_KERNEL); + kbd = kzalloc(sizeof(struct kbd_data), GFP_KERNEL); if (!kbd) goto out; - memset(kbd, 0, sizeof(struct kbd_data)); - kbd->key_maps = kmalloc(sizeof(key_maps), GFP_KERNEL); - if (!key_maps) + kbd->key_maps = kzalloc(sizeof(key_maps), GFP_KERNEL); + if (!kbd->key_maps) goto out_kbd; - memset(kbd->key_maps, 0, sizeof(key_maps)); for (i = 0; i < ARRAY_SIZE(key_maps); i++) { if (key_maps[i]) { kbd->key_maps[i] = @@ -68,10 +65,9 @@ kbd_alloc(void) { sizeof(u_short)*NR_KEYS); } } - kbd->func_table = kmalloc(sizeof(func_table), GFP_KERNEL); + kbd->func_table = kzalloc(sizeof(func_table), GFP_KERNEL); if (!kbd->func_table) goto out_maps; - memset(kbd->func_table, 0, sizeof(func_table)); for (i = 0; i < ARRAY_SIZE(func_table); i++) { if (func_table[i]) { len = strlen(func_table[i]) + 1; @@ -82,10 +78,9 @@ kbd_alloc(void) { } } kbd->fn_handler = - kmalloc(sizeof(fn_handler_fn *) * NR_FN_HANDLER, GFP_KERNEL); + kzalloc(sizeof(fn_handler_fn *) * NR_FN_HANDLER, GFP_KERNEL); if (!kbd->fn_handler) goto out_func; - memset(kbd->fn_handler, 0, sizeof(fn_handler_fn *) * NR_FN_HANDLER); kbd->accent_table = kmalloc(sizeof(struct kbdiacr)*MAX_DIACR, GFP_KERNEL); if (!kbd->accent_table) @@ -99,18 +94,16 @@ out_fn_handler: kfree(kbd->fn_handler); out_func: for (i = 0; i < ARRAY_SIZE(func_table); i++) - if (kbd->func_table[i]) - kfree(kbd->func_table[i]); + kfree(kbd->func_table[i]); kfree(kbd->func_table); out_maps: for (i = 0; i < ARRAY_SIZE(key_maps); i++) - if (kbd->key_maps[i]) - kfree(kbd->key_maps[i]); + kfree(kbd->key_maps[i]); kfree(kbd->key_maps); out_kbd: kfree(kbd); out: - return 0; + return NULL; } void @@ -121,12 +114,10 @@ kbd_free(struct kbd_data *kbd) kfree(kbd->accent_table); kfree(kbd->fn_handler); for (i = 0; i < ARRAY_SIZE(func_table); i++) - if (kbd->func_table[i]) - kfree(kbd->func_table[i]); + kfree(kbd->func_table[i]); kfree(kbd->func_table); for (i = 0; i < ARRAY_SIZE(key_maps); i++) - if (kbd->key_maps[i]) - kfree(kbd->key_maps[i]); + kfree(kbd->key_maps[i]); kfree(kbd->key_maps); kfree(kbd); } @@ -313,7 +304,7 @@ kbd_keycode(struct kbd_data *kbd, unsigned int keycode) if (kbd->sysrq) { if (kbd->sysrq == K(KT_LATIN, '-')) { kbd->sysrq = 0; - handle_sysrq(value, 0, kbd->tty); + handle_sysrq(value, kbd->tty); return; } if (value == '-') { @@ -360,7 +351,7 @@ do_kdsk_ioctl(struct kbd_data *kbd, struct kbentry __user *user_kbe, key_map = kbd->key_maps[tmp.kb_table]; if (key_map) { val = U(key_map[tmp.kb_index]); - if (KTYP(val) >= NR_TYPES) + if (KTYP(val) >= KBD_NR_TYPES) val = K_HOLE; } else val = (tmp.kb_index ? K_HOLE : K_NOSUCHMAP); @@ -372,21 +363,21 @@ do_kdsk_ioctl(struct kbd_data *kbd, struct kbentry __user *user_kbe, /* disallocate map */ key_map = kbd->key_maps[tmp.kb_table]; if (key_map) { - kbd->key_maps[tmp.kb_table] = 0; + kbd->key_maps[tmp.kb_table] = NULL; kfree(key_map); } break; } - if (KTYP(tmp.kb_value) >= NR_TYPES) + if (KTYP(tmp.kb_value) >= KBD_NR_TYPES) return -EINVAL; - if (KVAL(tmp.kb_value) > max_vals[KTYP(tmp.kb_value)]) + if (KVAL(tmp.kb_value) > kbd_max_vals[KTYP(tmp.kb_value)]) return -EINVAL; if (!(key_map = kbd->key_maps[tmp.kb_table])) { int j; - key_map = (ushort *) kmalloc(sizeof(plain_map), + key_map = kmalloc(sizeof(plain_map), GFP_KERNEL); if (!key_map) return -ENOMEM; @@ -444,7 +435,11 @@ do_kdgkb_ioctl(struct kbd_data *kbd, struct kbsentry __user *u_kbs, return -EPERM; len = strnlen_user(u_kbs->kb_string, sizeof(u_kbs->kb_string) - 1); - p = kmalloc(len, GFP_KERNEL); + if (!len) + return -EFAULT; + if (len > sizeof(u_kbs->kb_string) - 1) + return -EINVAL; + p = kmalloc(len + 1, GFP_KERNEL); if (!p) return -ENOMEM; if (copy_from_user(p, u_kbs->kb_string, len)) { @@ -452,8 +447,7 @@ do_kdgkb_ioctl(struct kbd_data *kbd, struct kbsentry __user *u_kbs, return -EFAULT; } p[len] = 0; - if (kbd->func_table[kb_func]) - kfree(kbd->func_table[kb_func]); + kfree(kbd->func_table[kb_func]); kbd->func_table[kb_func] = p; break; }