Browse Source

[PATCH] drivers/net/wireless: correct reported ssid lengths

ESSIDs can technically include NULL characters.  Drivers should not be
adjusting the length of the ESSID before reporting it in their
SIOCGIWESSID handlers.  Breaks stuff like wpa_supplicant.  Note that ipw
drivers, which seem to currently be the "most correct", don't have this
problem.

Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Dan Williams 19 năm trước cách đây
mục cha
commit
d6a13a24b7

+ 1 - 1
drivers/net/wireless/airo.c

@@ -5783,7 +5783,7 @@ static int airo_get_essid(struct net_device *dev,
 	/* If none, we may want to get the one that was set */
 	/* If none, we may want to get the one that was set */
 
 
 	/* Push it out ! */
 	/* Push it out ! */
-	dwrq->length = status_rid.SSIDlen + 1;
+	dwrq->length = status_rid.SSIDlen;
 	dwrq->flags = 1; /* active */
 	dwrq->flags = 1; /* active */
 
 
 	return 0;
 	return 0;

+ 2 - 2
drivers/net/wireless/atmel.c

@@ -1718,11 +1718,11 @@ static int atmel_get_essid(struct net_device *dev,
 	if (priv->new_SSID_size != 0) {
 	if (priv->new_SSID_size != 0) {
 		memcpy(extra, priv->new_SSID, priv->new_SSID_size);
 		memcpy(extra, priv->new_SSID, priv->new_SSID_size);
 		extra[priv->new_SSID_size] = '\0';
 		extra[priv->new_SSID_size] = '\0';
-		dwrq->length = priv->new_SSID_size + 1;
+		dwrq->length = priv->new_SSID_size;
 	} else {
 	} else {
 		memcpy(extra, priv->SSID, priv->SSID_size);
 		memcpy(extra, priv->SSID, priv->SSID_size);
 		extra[priv->SSID_size] = '\0';
 		extra[priv->SSID_size] = '\0';
-		dwrq->length = priv->SSID_size + 1;
+		dwrq->length = priv->SSID_size;
 	}
 	}
 
 
 	dwrq->flags = !priv->connect_to_any_BSS; /* active */
 	dwrq->flags = !priv->connect_to_any_BSS; /* active */

+ 1 - 1
drivers/net/wireless/prism54/isl_ioctl.c

@@ -748,7 +748,7 @@ prism54_get_essid(struct net_device *ndev, struct iw_request_info *info,
 	if (essid->length) {
 	if (essid->length) {
 		dwrq->flags = 1;	/* set ESSID to ON for Wireless Extensions */
 		dwrq->flags = 1;	/* set ESSID to ON for Wireless Extensions */
 		/* if it is to big, trunk it */
 		/* if it is to big, trunk it */
-		dwrq->length = min(IW_ESSID_MAX_SIZE, essid->length + 1);
+		dwrq->length = min(IW_ESSID_MAX_SIZE, essid->length);
 	} else {
 	} else {
 		dwrq->flags = 0;
 		dwrq->flags = 0;
 		dwrq->length = 0;
 		dwrq->length = 0;

+ 1 - 1
drivers/net/wireless/ray_cs.c

@@ -1256,7 +1256,7 @@ static int ray_get_essid(struct net_device *dev,
 	extra[IW_ESSID_MAX_SIZE] = '\0';
 	extra[IW_ESSID_MAX_SIZE] = '\0';
 
 
 	/* Push it out ! */
 	/* Push it out ! */
-	dwrq->length = strlen(extra) + 1;
+	dwrq->length = strlen(extra);
 	dwrq->flags = 1; /* active */
 	dwrq->flags = 1; /* active */
 
 
 	return 0;
 	return 0;

+ 1 - 1
drivers/net/wireless/wavelan_cs.c

@@ -2280,7 +2280,7 @@ static int wavelan_get_essid(struct net_device *dev,
 	extra[IW_ESSID_MAX_SIZE] = '\0';
 	extra[IW_ESSID_MAX_SIZE] = '\0';
 
 
 	/* Set the length */
 	/* Set the length */
-	wrqu->data.length = strlen(extra) + 1;
+	wrqu->data.length = strlen(extra);
 
 
 	return 0;
 	return 0;
 }
 }