The ieee80211_key struct can be kfree()d several times in the function, for example if some of the key setup functions fails beforehand, but there's no check if the struct is still valid before we call memcpy() and INIT_LIST_HEAD() on it. In some cases (like it was in my case), if there's missing aes-generic module it could lead to the following kernel OOPS: Unable to handle kernel NULL pointer dereference at virtual address 0000018c .... PC is at memcpy+0x80/0x29c ... Backtrace: [<bf11c5e4>] (ieee80211_key_alloc+0x0/0x234 [mac80211]) from [<bf1148b4>] (ieee80211_add_key+0x70/0x12c [mac80211]) [<bf114844>] (ieee80211_add_key+0x0/0x12c [mac80211]) from [<bf070cc0>] (__cfg80211_set_encryption+0x2a8/0x464 [cfg80211]) Signed-off-by: Petr Åtetiar <ynezz@xxxxxxx> CC: Johannes Berg <johannes@xxxxxxxxxxxxxxxx> --- net/mac80211/key.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/net/mac80211/key.c b/net/mac80211/key.c index 8c02469..8e49850 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c @@ -364,8 +364,11 @@ struct ieee80211_key *ieee80211_key_alloc(u32 cipher, int idx, size_t key_len, } break; } - memcpy(key->conf.key, key_data, key_len); - INIT_LIST_HEAD(&key->list); + + if (!IS_ERR(key)) { + memcpy(key->conf.key, key_data, key_len); + INIT_LIST_HEAD(&key->list); + } return key; } -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html