I'm still studying "git send-email", so the first intro part of prev msg deleted, sorry, again: Continuying my previous message, the JSIOCGBTNMAP always returns 1024 return code, but not "amount of buttons" like I said before (that is probably the size of the keymap that is _u16 keymap[KEY_MAX - BTN_MISC + 1] ). Is it correct? Reading the line of kernel joydev.c 579 len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->keypam)), , why the min is always sizeof(joydev->keypam) ? If I try to call from the userspace ioctl(fd, JSIOCGBTNMAP, buttons) where the buttons is "__u16 buttons[5]", then still I get 1024. Also I did userspace test (that shows how kernel overwrites (out of array bound) the userspace): 1. The buttons is "__u16 buttons[5]" in userspace, 2. buttons[5] = 1; 3. ioctl(fd, JSIOCGBTNMAP, buttons) 4. printf("new %i\n", buttons[5]), and the output is "new 0", so the value is being overwritten by kernel (so 1024 bytes copied to 10 bytes buffer). It looks like I don't understand what is the expected value of the _IOC_SIZE(cmd), why not 10 for this read ioctl example? Is it possible to make this ioctl safe, so it doesn't copy more data than user can handle?