Libertas: fix buffer overflow in lbs_get_essid()
authorDaniel Mack <[email protected]>
Wed, 16 Dec 2009 04:12:58 +0000 (05:12 +0100)
committerJohn W. Linville <[email protected]>
Mon, 21 Dec 2009 16:32:24 +0000 (11:32 -0500)
The libertas driver copies the SSID buffer back to the wireless core and
appends a trailing NULL character for termination. This is

a) unnecessary because the buffer is allocated with kzalloc and is hence
   already NULLed when this function is called, and

b) for priv->curbssparams.ssid_len == 32, it writes back one byte too
   much which causes memory corruptions.

Fix this by removing the extra write.

Signed-off-by: Daniel Mack <[email protected]>
Cc: Stephen Hemminger <[email protected]>
Cc: Maithili Hinge <[email protected]>
Cc: Kiran Divekar <[email protected]>
Cc: Michael Hirsch <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Acked-by: Holger Schurig <[email protected]>
Acked-by: Dan Williams <[email protected]>
Signed-off-by: John W. Linville <[email protected]>
drivers/net/wireless/libertas/wext.c

index a8eb9e1fcf36ac7cca8cd3c4965af40f1454f310..4b1aab593a84ea93fbfd7721d58004e65113fd26 100644 (file)
@@ -2025,10 +2025,8 @@ static int lbs_get_essid(struct net_device *dev, struct iw_request_info *info,
        if (priv->connect_status == LBS_CONNECTED) {
                memcpy(extra, priv->curbssparams.ssid,
                       priv->curbssparams.ssid_len);
-               extra[priv->curbssparams.ssid_len] = '\0';
        } else {
                memset(extra, 0, 32);
-               extra[priv->curbssparams.ssid_len] = '\0';
        }
        /*
         * If none, we may want to get the one that was set