rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, ies->data, ies->len);
        if (rsn_ie) {
+               int rsn_ie_len = sizeof(struct element) + rsn_ie[1];
                int offset = 8;
 
-               param->mode_802_11i = 2;
-               param->rsn_found = true;
                /* extract RSN capabilities */
-               offset += (rsn_ie[offset] * 4) + 2;
-               offset += (rsn_ie[offset] * 4) + 2;
-               memcpy(param->rsn_cap, &rsn_ie[offset], 2);
+               if (offset < rsn_ie_len) {
+                       /* skip over pairwise suites */
+                       offset += (rsn_ie[offset] * 4) + 2;
+
+                       if (offset < rsn_ie_len) {
+                               /* skip over authentication suites */
+                               offset += (rsn_ie[offset] * 4) + 2;
+
+                               if (offset + 1 < rsn_ie_len) {
+                                       param->mode_802_11i = 2;
+                                       param->rsn_found = true;
+                                       memcpy(param->rsn_cap, &rsn_ie[offset], 2);
+                               }
+                       }
+               }
        }
 
        if (param->rsn_found) {