/* Make a copy of current BSSID descriptor */
        memcpy(&priv->curr_bss_params.bss_descriptor, bss_desc,
               sizeof(priv->curr_bss_params.bss_descriptor));
+
+       /* The contents of beacon_ie will be copied to its own buffer
+        * in mwifiex_save_curr_bcn()
+        */
        mwifiex_save_curr_bcn(priv);
        spin_unlock_irqrestore(&priv->curr_bcn_buf_lock, flags);
 
 done:
+       /* beacon_ie buffer was allocated in function
+        * mwifiex_fill_new_bss_desc(). Free it now.
+        */
+       kfree(bss_desc->beacon_buf);
        kfree(bss_desc);
        return 0;
 }
 
 /*
  * This function fills bss descriptor structure using provided
  * information.
+ * beacon_ie buffer is allocated in this function. It is caller's
+ * responsibility to free the memory.
  */
 int mwifiex_fill_new_bss_desc(struct mwifiex_private *priv,
                              struct cfg80211_bss *bss,
                              struct mwifiex_bssdescriptor *bss_desc)
 {
-       int ret;
        u8 *beacon_ie;
        size_t beacon_ie_len;
        struct mwifiex_bss_priv *bss_priv = (void *)bss->priv;
 
        memcpy(bss_desc->mac_address, bss->bssid, ETH_ALEN);
        bss_desc->rssi = bss->signal;
+       /* The caller of this function will free beacon_ie */
        bss_desc->beacon_buf = beacon_ie;
        bss_desc->beacon_buf_size = beacon_ie_len;
        bss_desc->beacon_period = bss->beacon_interval;
        else
                bss_desc->bss_mode = NL80211_IFTYPE_STATION;
 
-       ret = mwifiex_update_bss_desc_with_ie(priv->adapter, bss_desc);
-
-       kfree(beacon_ie);
-       return ret;
+       return mwifiex_update_bss_desc_with_ie(priv->adapter, bss_desc);
 }
 
 static int mwifiex_process_country_ie(struct mwifiex_private *priv,
        }
 
 done:
+       /* beacon_ie buffer was allocated in function
+        * mwifiex_fill_new_bss_desc(). Free it now.
+        */
+       if (bss_desc)
+               kfree(bss_desc->beacon_buf);
        kfree(bss_desc);
        return ret;
 }