There's no need to put the values on the stack, just pass a pointer to the data in the nl80211 message. This reduces stack usage and avoids potential issues with putting sensitive data on the stack.
Unified · Split
| @@ -1980,14 +1980,12 @@ struct cfg80211_wowlan_wakeup { · 1979 unmodified lines | |||
| 1980 | 1980 | ||
| 1981 | /** | 1981 | /** |
| 1982 | * struct cfg80211_gtk_rekey_data - rekey data | 1982 | * struct cfg80211_gtk_rekey_data - rekey data |
| 1983 | * @kek: key encryption key | 1983 | * @kek: key encryption key (NL80211_KEK_LEN bytes) |
| 1984 | * @kck: key confirmation key | 1984 | * @kck: key confirmation key (NL80211_KCK_LEN bytes) |
| 1985 | * @replay_ctr: replay counter | 1985 | * @replay_ctr: replay counter (NL80211_REPLAY_CTR_LEN bytes) |
| 1986 | */ | 1986 | */ |
| 1987 | struct cfg80211_gtk_rekey_data { | 1987 | struct cfg80211_gtk_rekey_data { |
| 1988 | u8 kek[NL80211_KEK_LEN]; | 1988 | const u8 *kek, *kck, *replay_ctr; |
| 1989 | u8 kck[NL80211_KCK_LEN]; | ||
| 1990 | u8 replay_ctr[NL80211_REPLAY_CTR_LEN]; | ||
| 1991 | }; | 1989 | }; |
| 1992 | 1990 | ||
| 1993 | /** | 1991 | /** |
| @@ -8959,13 +8959,9 @@ static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) · 8958 unmodified lines | |||
| 8959 | if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN) | 8959 | if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN) |
| 8960 | return -ERANGE; | 8960 | return -ERANGE; |
| 8961 | 8961 | ||
| 8962 | memcpy(rekey_data.kek, nla_data(tb[NL80211_REKEY_DATA_KEK]), | 8962 | rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]); |
| 8963 | NL80211_KEK_LEN); | 8963 | rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]); |
| 8964 | memcpy(rekey_data.kck, nla_data(tb[NL80211_REKEY_DATA_KCK]), | 8964 | rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]); |
| 8965 | NL80211_KCK_LEN); | ||
| 8966 | memcpy(rekey_data.replay_ctr, | ||
| 8967 | nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]), | ||
| 8968 | NL80211_REPLAY_CTR_LEN); | ||
| 8969 | 8965 | ||
| 8970 | wdev_lock(wdev); | 8966 | wdev_lock(wdev); |
| 8971 | if (!wdev->current_bss) { | 8967 | if (!wdev->current_bss) { |