net: wireless: bcmdhd: Update to Version 5.90.125.94.1
Dmitry Shmidt [Wed, 30 Nov 2011 20:49:02 +0000 (12:49 -0800)]
- Return zeroed private command buffer
- Fix memory leak in wl_inform_single_bss()

Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>

drivers/net/wireless/bcmdhd/dhd_common.c
drivers/net/wireless/bcmdhd/dhd_linux_mon.c
drivers/net/wireless/bcmdhd/include/epivers.h
drivers/net/wireless/bcmdhd/wl_android.c
drivers/net/wireless/bcmdhd/wl_cfg80211.c

index 372ec80..07f2124 100644 (file)
@@ -1907,6 +1907,7 @@ dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid, ushort scan_fr,
        if ((!dhd) && (!ssids_local)) {
                DHD_ERROR(("%s error exit\n", __FUNCTION__));
                err = -1;
+               return err;
        }
 
        if (dhd_check_ap_wfd_mode_set(dhd) == TRUE)
@@ -2160,14 +2161,14 @@ wl_iw_parse_channel_list_tlv(char** list_str, uint16* channel_list,
 int
 wl_iw_parse_ssid_list_tlv(char** list_str, wlc_ssid_t* ssid, int max, int *bytes_left)
 {
-       char* str =  *list_str;
+       char* str;
        int idx = 0;
 
        if ((list_str == NULL) || (*list_str == NULL) || (*bytes_left < 0)) {
                DHD_ERROR(("%s error paramters\n", __FUNCTION__));
                return -1;
        }
-
+       str = *list_str;
        while (*bytes_left > 0) {
 
                if (str[0] != CSCAN_TLV_TYPE_SSID_IE) {
index dd9c71f..ce94ff9 100644 (file)
@@ -225,9 +225,10 @@ static void dhd_mon_if_set_multicast_list(struct net_device *ndev)
        mon_if = ndev_to_monif(ndev);
        if (mon_if == NULL || mon_if->real_ndev == NULL) {
                MON_PRINT(" cannot find matched net dev, skip the packet\n");
+       } else {
+               MON_PRINT("enter, if name: %s, matched if name %s\n",
+               ndev->name, mon_if->real_ndev->name);
        }
-
-       MON_PRINT("enter, if name: %s, matched if name %s\n", ndev->name, mon_if->real_ndev->name);
 }
 
 static int dhd_mon_if_change_mac(struct net_device *ndev, void *addr)
@@ -238,9 +239,10 @@ static int dhd_mon_if_change_mac(struct net_device *ndev, void *addr)
        mon_if = ndev_to_monif(ndev);
        if (mon_if == NULL || mon_if->real_ndev == NULL) {
                MON_PRINT(" cannot find matched net dev, skip the packet\n");
+       } else {
+               MON_PRINT("enter, if name: %s, matched if name %s\n",
+               ndev->name, mon_if->real_ndev->name);
        }
-
-       MON_PRINT("enter, if name: %s, matched if name %s\n", ndev->name, mon_if->real_ndev->name);
        return ret;
 }
 
index ae1f975..fe71e16 100644 (file)
@@ -44,6 +44,6 @@
 #define EPI_VERSION_DEV                5.90.125
 
 
-#define        EPI_VERSION_STR         "5.90.125.94"
+#define        EPI_VERSION_STR         "5.90.125.94.1"
 
 #endif 
index 67f7d9f..b680481 100644 (file)
@@ -559,8 +559,10 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                bytes_written = strlen("OK");
        }
 
-       if (bytes_written > 0) {
-               if (bytes_written > priv_cmd.total_len) {
+       if (bytes_written >= 0) {
+               if ((bytes_written == 0) && (priv_cmd.total_len > 0))
+                       command[0] = '\0';
+               if (bytes_written >= priv_cmd.total_len) {
                        DHD_ERROR(("%s: bytes_written = %d\n", __FUNCTION__, bytes_written));
                        bytes_written = priv_cmd.total_len;
                } else {
@@ -571,7 +573,8 @@ int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                        DHD_ERROR(("%s: failed to copy data to user buffer\n", __FUNCTION__));
                        ret = -EFAULT;
                }
-       } else {
+       }
+       else {
                ret = bytes_written;
        }
 
index 04affb5..17ed972 100644 (file)
@@ -4157,6 +4157,7 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi)
        struct wl_cfg80211_bss_info *notif_bss_info;
        struct wl_scan_req *sr = wl_to_sr(wl);
        struct beacon_proberesp *beacon_proberesp;
+       struct cfg80211_bss *cbss = NULL;
        s32 mgmt_type;
        s32 signal;
        u32 freq;
@@ -4215,13 +4216,15 @@ static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi)
 
        signal = notif_bss_info->rssi * 100;
 
-       if (unlikely(!cfg80211_inform_bss_frame(wiphy, channel, mgmt,
-               le16_to_cpu(notif_bss_info->frame_len),
-               signal, GFP_KERNEL))) {
+       cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt,
+               le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL);
+       if (unlikely(!cbss)) {
                WL_ERR(("cfg80211_inform_bss_frame error\n"));
                kfree(notif_bss_info);
                return -EINVAL;
        }
+
+       cfg80211_put_bss(cbss);
        kfree(notif_bss_info);
 
        return err;