Re: [wireless.c bug report] 32 character ESSID not displayed in iwconfig
From: Jean Tourrilhes <hidden>
Date: 2007-12-04 17:55:59
On Tue, Dec 04, 2007 at 05:03:53AM +0000, Sunny Kim wrote:
Hi, I'm Sunny Kim from SAMSUNG Electro-Mechanics. I want to give you a bug report. Please, see my pdf doc attached. I hope you find this helpful. < the first part of pdf doc > Title: 32 character ESSID not displayed in iwconfig Reported by: Sunny Kim (sungyi.kim@samsung.com) Detail descriptions: I found the problem in net/core/wireless.c when ESSID was 32 character long. This problem prevents iwconfig from displaying ESSID correctly when ESSID is 32 character long. Regards, Sunny Kim
Hi, Thanks for the bug report. This bug is well known and has been reported to me many times over the last 6 months. The kernel maintainers don't want to fix it. The patch for the 2.6.22 and later is attached to this e-mail. Have fun... Jean ----------------------------------------------------------
--- linux/net/wireless/wext.j1.c 2007-07-09 13:19:22.000000000 -0700
+++ linux/net/wireless/wext.c 2007-07-09 13:19:59.000000000 -0700@@ -741,39 +741,11 @@ static int ioctl_standard_call(struct ne int extra_size; int user_length = 0; int err; - int essid_compat = 0; /* Calculate space needed by arguments. Always allocate * for max space. Easier, and won't last long... */ extra_size = descr->max_tokens * descr->token_size; - /* Check need for ESSID compatibility for WE < 21 */ - switch (cmd) { - case SIOCSIWESSID: - case SIOCGIWESSID: - case SIOCSIWNICKN: - case SIOCGIWNICKN: - if (iwr->u.data.length == descr->max_tokens + 1) - essid_compat = 1; - else if (IW_IS_SET(cmd) && (iwr->u.data.length != 0)) { - char essid[IW_ESSID_MAX_SIZE + 1]; - - err = copy_from_user(essid, iwr->u.data.pointer, - iwr->u.data.length * - descr->token_size); - if (err) - return -EFAULT; - - if (essid[iwr->u.data.length - 1] == '\0') - essid_compat = 1; - } - break; - default: - break; - } - - iwr->u.data.length -= essid_compat; - /* Check what user space is giving us */ if (IW_IS_SET(cmd)) { /* Check NULL pointer */
@@ -811,7 +783,6 @@ static int ioctl_standard_call(struct ne } /* Create the kernel buffer */ - /* kzalloc ensures NULL-termination for essid_compat */ extra = kzalloc(extra_size, GFP_KERNEL); if (extra == NULL) return -ENOMEM;
@@ -830,8 +801,6 @@ static int ioctl_standard_call(struct ne /* Call the handler */ ret = handler(dev, &info, &(iwr->u), extra); - iwr->u.data.length += essid_compat; - /* If we have something to return to the user */ if (!ret && IW_IS_GET(cmd)) { /* Check if there is enough buffer up there */