···748748 int extra_size;749749 int user_length = 0;750750 int err;751751+ int essid_compat = 0;751752752753 /* Calculate space needed by arguments. Always allocate753754 * for max space. Easier, and won't last long... */754755 extra_size = descr->max_tokens * descr->token_size;756756+757757+ /* Check need for ESSID compatibility for WE < 21 */758758+ switch (cmd) {759759+ case SIOCSIWESSID:760760+ case SIOCGIWESSID:761761+ case SIOCSIWNICKN:762762+ case SIOCGIWNICKN:763763+ if (iwr->u.data.length == descr->max_tokens + 1)764764+ essid_compat = 1;765765+ else if (IW_IS_SET(cmd) && (iwr->u.data.length != 0)) {766766+ char essid[IW_ESSID_MAX_SIZE + 1];767767+768768+ err = copy_from_user(essid, iwr->u.data.pointer,769769+ iwr->u.data.length *770770+ descr->token_size);771771+ if (err)772772+ return -EFAULT;773773+774774+ if (essid[iwr->u.data.length - 1] == '\0')775775+ essid_compat = 1;776776+ }777777+ break;778778+ default:779779+ break;780780+ }781781+782782+ iwr->u.data.length -= essid_compat;755783756784 /* Check what user space is giving us */757785 if(IW_IS_SET(cmd)) {···823795#endif /* WE_IOCTL_DEBUG */824796825797 /* Create the kernel buffer */826826- extra = kmalloc(extra_size, GFP_KERNEL);798798+ /* kzalloc ensures NULL-termination for essid_compat */799799+ extra = kzalloc(extra_size, GFP_KERNEL);827800 if (extra == NULL) {828801 return -ENOMEM;829802 }···847818848819 /* Call the handler */849820 ret = handler(dev, &info, &(iwr->u), extra);821821+822822+ iwr->u.data.length += essid_compat;850823851824 /* If we have something to return to the user */852825 if (!ret && IW_IS_GET(cmd)) {