Linux 5.4.219
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.219 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 +- fs/splice.c | 10 ++++++---- net/mac80211/ieee80211_i.h | 4 ++-- net/mac80211/mlme.c | 21 +++++++++++++-------- net/mac80211/scan.c | 2 ++ net/mac80211/util.c | 11 ++++++----- 6 files changed, 30 insertions(+), 20 deletions(-)
Greg Kroah-Hartman (1):
Linux 5.4.219
Johannes Berg (3):
mac80211: mlme: find auth challenge directly
wifi: mac80211: don't parse mbssid in assoc response
wifi: mac80211: fix MBSSID parsing use-after-free
Sasha Levin (1):
Revert "fs: check FMODE_LSEEK to control internal pipe splicing"
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 218 +SUBLEVEL = 219 EXTRAVERSION = NAME = Kleptomaniac Octopus
fs/splice.c +6 -4
@@ -895,15 +895,17 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, {struct pipe_inode_info *pipe;long ret, bytes; +umode_t i_mode;size_t len;int i, flags, more;/* -* We require the input to be seekable, as we don't want to randomly -* drop data for eg socket -> socket splicing. Use the piped splicing -* for that! +* We require the input being a regular file, as we don't want to +* randomly drop data for eg socket -> socket splicing. Use the +* piped splicing for that! */ -if (unlikely (!(in->f_mode &FMODE_LSEEK ))) + i_mode =file_inode (in)->i_mode; +if (unlikely (!S_ISREG (i_mode) && !S_ISBLK (i_mode)))return -EINVAL ;/*
net/mac80211/ieee80211_i.h +2 -2
@@ -1460,7 +1460,6 @@ struct ieee802_11_elems {const u8 *supp_rates;const u8 *ds_params;const struct ieee80211_tim_ie *tim; -const u8 *challenge;const u8 *rsn;const u8 *erp_info;const u8 *ext_supp_rates;
@@ -1507,7 +1506,6 @@ struct ieee802_11_elems {u8 ssid_len;u8 supp_rates_len;u8 tim_len; -u8 challenge_len;u8 rsn_len;u8 ext_supp_rates_len;u8 wmm_info_len;
@@ -1521,6 +1519,8 @@ struct ieee802_11_elems {u8 country_elem_len;u8 bssid_index_len; +void *nontx_profile; +/* whether a parse error occurred while retrieving these elements */ bool parse_error; };
net/mac80211/mlme.c +13 -8
@@ -2829,14 +2829,14 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, {struct ieee80211_local *local = sdata->local;struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; +const struct element *challenge;u8 *pos; -struct ieee802_11_elems elems;u32 tx_flags =0 ; pos = mgmt->u.auth.variable; -ieee802_11_parse_elems (pos, len - (pos - (u8 *)mgmt), false, &elems, - mgmt->bssid, auth_data->bss->bssid); -if (!elems.challenge) + challenge =cfg80211_find_elem (WLAN_EID_CHALLENGE , pos, + len - (pos - (u8 *)mgmt)); +if (!challenge)return ; auth_data->expected_transaction =4 ;drv_mgd_prepare_tx (sdata->local, sdata,0 );
@@ -2844,7 +2844,8 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, tx_flags =IEEE80211_TX_CTL_REQ_TX_STATUS |IEEE80211_TX_INTFL_MLME_CONN_TX ;ieee80211_send_auth (sdata,3 , auth_data->algorithm,0 , - elems.challenge -2 , elems.challenge_len +2 , + (void *)challenge, + challenge->datalen +sizeof (*challenge), auth_data->bss->bssid, auth_data->bss->bssid, auth_data->key, auth_data->key_len, auth_data->key_idx, tx_flags);
@@ -3223,7 +3224,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, pos = mgmt->u.assoc_resp.variable;ieee802_11_parse_elems (pos, len - (pos - (u8 *)mgmt), false, &elems, - mgmt->bssid, assoc_data->bss->bssid); + mgmt->bssid,NULL );if (!elems.supp_rates) {sdata_info (sdata,"no SuppRates element in AssocResp\n" );
@@ -3298,6 +3299,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,sdata_info (sdata,"AP bug: VHT operation missing from AssocResp\n" ); } +kfree (bss_elems.nontx_profile); }/*
@@ -3575,7 +3577,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, pos = mgmt->u.assoc_resp.variable;ieee802_11_parse_elems (pos, len - (pos - (u8 *)mgmt), false, &elems, - mgmt->bssid, assoc_data->bss->bssid); + mgmt->bssid,NULL ); if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY && elems.timeout_int &&
@@ -3882,6 +3884,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, ifmgd->assoc_data->timeout = jiffies; ifmgd->assoc_data->timeout_started = true;run_again (sdata, ifmgd->assoc_data->timeout); +kfree (elems.nontx_profile);return ; }
@@ -4049,7 +4052,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,ieee80211_report_disconnect (sdata, deauth_buf,sizeof (deauth_buf), true,WLAN_REASON_DEAUTH_LEAVING ); -return ; + goto free; }if (sta && elems.opmode_notif)
@@ -4064,6 +4067,8 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, elems.cisco_dtpc_elem);ieee80211_bss_info_change_notify (sdata, changed); +free: +kfree (elems.nontx_profile); } void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
net/mac80211/scan.c +2 -0
@@ -216,6 +216,8 @@ ieee80211_bss_info_update(struct ieee80211_local *local, rx_status, beacon); } +kfree (elems.nontx_profile); +return bss; }
net/mac80211/util.c +6 -5
@@ -1006,10 +1006,6 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, }else elem_parse_failed = true;break ; -case WLAN_EID_CHALLENGE : - elems->challenge = pos; - elems->challenge_len = elen; -break ;case WLAN_EID_VENDOR_SPECIFIC :if (elen >=4 && pos[0 ] ==0x00 && pos[1 ] ==0x50 && pos[2 ] ==0xf2 ) {
@@ -1367,6 +1363,11 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,cfg80211_find_ext_elem (WLAN_EID_EXT_NON_INHERITANCE , nontransmitted_profile, nontransmitted_profile_len); +if (!nontransmitted_profile_len) { + nontransmitted_profile_len =0 ; +kfree (nontransmitted_profile); + nontransmitted_profile =NULL ; + } } crc = _ieee802_11_parse_elems_crc(start, len, action, elems, filter,
@@ -1396,7 +1397,7 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, offsetofend(struct ieee80211_bssid_index, dtim_count)) elems->dtim_count = elems->bssid_index->dtim_count; -kfree (nontransmitted_profile); + elems->nontx_profile = nontransmitted_profile;return crc; }