Unverified Commit be4b2580 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!5358 v5 CVE-2023-52595

Merge Pull Request from: @ci-robot 
 
PR sync from: Pu Lehui <pulehui@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/EAFEYAXUYJV542P6NUCIDTLCDS3MKYGU/ 
Pu Lehui (1):
  rt2x00: Fix kabi breakage in struct rt2x00lib_ops

Shiji Yang (1):
  wifi: rt2x00: restart beacon queue when hardware reset

Stanislaw Gruszka (4):
  rt2800: do not nullify initialization vector data
  rt2800: add pre_reset_hw callback
  rt2x00: clear up IV's on key removal


-- 
2.34.1
 
https://gitee.com/src-openeuler/kernel/issues/I96GO9 
 
Link:https://gitee.com/openeuler/kernel/pulls/5358

 

Reviewed-by: default avatarLiu YongQiang <liuyongqiang13@huawei.com>
Signed-off-by: default avatarZhang Changzhong <zhangchangzhong@huawei.com>
parents 2363298a 99254b9d
Loading
Loading
Loading
Loading
+42 −10
Original line number Diff line number Diff line
@@ -1440,12 +1440,18 @@ static void rt2800_config_wcid_attr_cipher(struct rt2x00_dev *rt2x00dev,

	offset = MAC_IVEIV_ENTRY(key->hw_key_idx);

	memset(&iveiv_entry, 0, sizeof(iveiv_entry));
	if (crypto->cmd == SET_KEY) {
		rt2800_register_multiread(rt2x00dev, offset,
					  &iveiv_entry, sizeof(iveiv_entry));
		if ((crypto->cipher == CIPHER_TKIP) ||
		    (crypto->cipher == CIPHER_TKIP_NO_MIC) ||
		    (crypto->cipher == CIPHER_AES))
			iveiv_entry.iv[3] |= 0x20;
		iveiv_entry.iv[3] |= key->keyidx << 6;
	} else {
		memset(&iveiv_entry, 0, sizeof(iveiv_entry));
	}

	rt2800_register_multiwrite(rt2x00dev, offset,
				   &iveiv_entry, sizeof(iveiv_entry));
}
@@ -1636,6 +1642,25 @@ int rt2800_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
}
EXPORT_SYMBOL_GPL(rt2800_sta_remove);

void rt2800_pre_reset_hw(struct rt2x00_dev *rt2x00dev)
{
	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
	struct data_queue *queue = rt2x00dev->bcn;
	struct queue_entry *entry;
	int i, wcid;

	for (wcid = WCID_START; wcid < WCID_END; wcid++) {
		drv_data->wcid_to_sta[wcid - WCID_START] = NULL;
		__clear_bit(wcid - WCID_START, drv_data->sta_ids);
	}

	for (i = 0; i < queue->limit; i++) {
		entry = &queue->entries[i];
		clear_bit(ENTRY_BCN_ASSIGNED, &entry->flags);
	}
}
EXPORT_SYMBOL_GPL(rt2800_pre_reset_hw);

void rt2800_config_filter(struct rt2x00_dev *rt2x00dev,
			  const unsigned int filter_flags)
{
@@ -5546,15 +5571,22 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
	 * ASIC will keep garbage value after boot, clear encryption keys.
	 */
	for (i = 0; i < 4; i++)
		rt2800_register_write(rt2x00dev,
					 SHARED_KEY_MODE_ENTRY(i), 0);
		rt2800_register_write(rt2x00dev, SHARED_KEY_MODE_ENTRY(i), 0);

	for (i = 0; i < 256; i++) {
		rt2800_config_wcid(rt2x00dev, NULL, i);
		rt2800_delete_wcid_attr(rt2x00dev, i);
		rt2800_register_write(rt2x00dev, MAC_IVEIV_ENTRY(i), 0);
	}

	/*
	 * Clear encryption initialization vectors on start, but keep them
	 * for watchdog reset. Otherwise we will have wrong IVs and not be
	 * able to keep connections after reset.
	 */
	if (!test_bit(DEVICE_STATE_RESET, &rt2x00dev->flags))
		for (i = 0; i < 256; i++)
			rt2800_register_write(rt2x00dev, MAC_IVEIV_ENTRY(i), 0);

	/*
	 * Clear all beacons
	 */
+1 −0
Original line number Diff line number Diff line
@@ -254,5 +254,6 @@ void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev);
void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
			       unsigned short *txwi_size,
			       unsigned short *rxwi_size);
void rt2800_pre_reset_hw(struct rt2x00_dev *rt2x00dev);

#endif /* RT2800LIB_H */
+5 −0
Original line number Diff line number Diff line
@@ -52,6 +52,11 @@ static bool modparam_nohwcrypt = false;
module_param_named(nohwcrypt, modparam_nohwcrypt, bool, 0444);
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");

void rt2x00lib_pre_reset_hw(struct rt2x00_dev *rt2x00dev)
{
	rt2800_pre_reset_hw(rt2x00dev);
}

static bool rt2800pci_hwcrypt_disabled(struct rt2x00_dev *rt2x00dev)
{
	return modparam_nohwcrypt;
+5 −0
Original line number Diff line number Diff line
@@ -44,6 +44,11 @@ static bool modparam_nohwcrypt;
module_param_named(nohwcrypt, modparam_nohwcrypt, bool, 0444);
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");

void rt2x00lib_pre_reset_hw(struct rt2x00_dev *rt2x00dev)
{
	rt2800_pre_reset_hw(rt2x00dev);
}

static bool rt2800soc_hwcrypt_disabled(struct rt2x00_dev *rt2x00dev)
{
	return modparam_nohwcrypt;
+5 −0
Original line number Diff line number Diff line
@@ -46,6 +46,11 @@ static bool modparam_nohwcrypt;
module_param_named(nohwcrypt, modparam_nohwcrypt, bool, 0444);
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");

void rt2x00lib_pre_reset_hw(struct rt2x00_dev *rt2x00dev)
{
	rt2800_pre_reset_hw(rt2x00dev);
}

static bool rt2800usb_hwcrypt_disabled(struct rt2x00_dev *rt2x00dev)
{
	return modparam_nohwcrypt;
Loading