From: Greg Kroah-Hartman Date: Sat, 6 Sep 2025 20:18:19 +0000 (+0200) Subject: 6.6-stable patches X-Git-Tag: v5.4.299~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8ba744c0410d75190070b5c0a92ea112bf3a7fb8;p=thirdparty%2Fkernel%2Fstable-queue.git 6.6-stable patches added patches: batman-adv-fix-oob-read-write-in-network-coding-decode.patch cifs-prevent-null-pointer-dereference-in-utf16-conversion.patch drm-amdgpu-drop-hw-access-in-non-dc-audio-fini.patch e1000e-fix-heap-overflow-in-e1000_set_eeprom.patch net-pcs-rzn1-miic-correct-modctrl-register-offset.patch ocfs2-prevent-release-journal-inode-after-journal-shutdown.patch platform-x86-amd-pmc-add-tuxedo-ib-pro-gen10-amd-to-spurious-8042-quirks-list.patch proc-fix-missing-pde_set_flags-for-net-proc-files.patch sched-fix-sched_numa_find_nth_cpu-if-mask-offline.patch scsi-lpfc-fix-buffer-free-clear-order-in-deferred-receive-path.patch soc-qcom-mdt_loader-deal-with-zero-e_shentsize.patch wifi-mt76-mt7996-initialize-hdr-before-passing-to-skb_put_data.patch wifi-mwifiex-initialize-the-chan_stats-array-to-zero.patch --- diff --git a/queue-6.6/batman-adv-fix-oob-read-write-in-network-coding-decode.patch b/queue-6.6/batman-adv-fix-oob-read-write-in-network-coding-decode.patch new file mode 100644 index 0000000000..b3ca6e46e7 --- /dev/null +++ b/queue-6.6/batman-adv-fix-oob-read-write-in-network-coding-decode.patch @@ -0,0 +1,44 @@ +From d77b6ff0ce35a6d0b0b7b9581bc3f76d041d4087 Mon Sep 17 00:00:00 2001 +From: Stanislav Fort +Date: Sun, 31 Aug 2025 16:56:23 +0200 +Subject: batman-adv: fix OOB read/write in network-coding decode + +From: Stanislav Fort + +commit d77b6ff0ce35a6d0b0b7b9581bc3f76d041d4087 upstream. + +batadv_nc_skb_decode_packet() trusts coded_len and checks only against +skb->len. XOR starts at sizeof(struct batadv_unicast_packet), reducing +payload headroom, and the source skb length is not verified, allowing an +out-of-bounds read and a small out-of-bounds write. + +Validate that coded_len fits within the payload area of both destination +and source sk_buffs before XORing. + +Fixes: 2df5278b0267 ("batman-adv: network coding - receive coded packets and decode them") +Cc: stable@vger.kernel.org +Reported-by: Stanislav Fort +Signed-off-by: Stanislav Fort +Signed-off-by: Sven Eckelmann +Signed-off-by: Simon Wunderlich +Signed-off-by: Greg Kroah-Hartman +--- + net/batman-adv/network-coding.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +--- a/net/batman-adv/network-coding.c ++++ b/net/batman-adv/network-coding.c +@@ -1687,7 +1687,12 @@ batadv_nc_skb_decode_packet(struct batad + + coding_len = ntohs(coded_packet_tmp.coded_len); + +- if (coding_len > skb->len) ++ /* ensure dst buffer is large enough (payload only) */ ++ if (coding_len + h_size > skb->len) ++ return NULL; ++ ++ /* ensure src buffer is large enough (payload only) */ ++ if (coding_len + h_size > nc_packet->skb->len) + return NULL; + + /* Here the magic is reversed: diff --git a/queue-6.6/cifs-prevent-null-pointer-dereference-in-utf16-conversion.patch b/queue-6.6/cifs-prevent-null-pointer-dereference-in-utf16-conversion.patch new file mode 100644 index 0000000000..886695454b --- /dev/null +++ b/queue-6.6/cifs-prevent-null-pointer-dereference-in-utf16-conversion.patch @@ -0,0 +1,39 @@ +From 70bccd9855dae56942f2b18a08ba137bb54093a0 Mon Sep 17 00:00:00 2001 +From: Makar Semyonov +Date: Thu, 4 Sep 2025 15:28:41 +0300 +Subject: cifs: prevent NULL pointer dereference in UTF16 conversion + +From: Makar Semyonov + +commit 70bccd9855dae56942f2b18a08ba137bb54093a0 upstream. + +There can be a NULL pointer dereference bug here. NULL is passed to +__cifs_sfu_make_node without checks, which passes it unchecked to +cifs_strndup_to_utf16, which in turn passes it to +cifs_local_to_utf16_bytes where '*from' is dereferenced, causing a crash. + +This patch adds a check for NULL 'src' in cifs_strndup_to_utf16 and +returns NULL early to prevent dereferencing NULL pointer. + +Found by Linux Verification Center (linuxtesting.org) with SVACE + +Signed-off-by: Makar Semyonov +Cc: stable@vger.kernel.org +Signed-off-by: Steve French +Signed-off-by: Greg Kroah-Hartman +--- + fs/smb/client/cifs_unicode.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/fs/smb/client/cifs_unicode.c ++++ b/fs/smb/client/cifs_unicode.c +@@ -629,6 +629,9 @@ cifs_strndup_to_utf16(const char *src, c + int len; + __le16 *dst; + ++ if (!src) ++ return NULL; ++ + len = cifs_local_to_utf16_bytes(src, maxlen, cp); + len += 2; /* NULL */ + dst = kmalloc(len, GFP_KERNEL); diff --git a/queue-6.6/drm-amdgpu-drop-hw-access-in-non-dc-audio-fini.patch b/queue-6.6/drm-amdgpu-drop-hw-access-in-non-dc-audio-fini.patch new file mode 100644 index 0000000000..0452f5fa87 --- /dev/null +++ b/queue-6.6/drm-amdgpu-drop-hw-access-in-non-dc-audio-fini.patch @@ -0,0 +1,105 @@ +From 71403f58b4bb6c13b71c05505593a355f697fd94 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Wed, 6 Aug 2025 10:47:50 -0400 +Subject: drm/amdgpu: drop hw access in non-DC audio fini + +From: Alex Deucher + +commit 71403f58b4bb6c13b71c05505593a355f697fd94 upstream. + +We already disable the audio pins in hw_fini so +there is no need to do it again in sw_fini. + +Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4481 +Cc: oushixiong +Signed-off-by: Alex Deucher +(cherry picked from commit 5eeb16ca727f11278b2917fd4311a7d7efb0bbd6) +Cc: stable@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 5 ----- + drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 5 ----- + drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 5 ----- + drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 5 ----- + 4 files changed, 20 deletions(-) + +--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +@@ -1459,17 +1459,12 @@ static int dce_v10_0_audio_init(struct a + + static void dce_v10_0_audio_fini(struct amdgpu_device *adev) + { +- int i; +- + if (!amdgpu_audio) + return; + + if (!adev->mode_info.audio.enabled) + return; + +- for (i = 0; i < adev->mode_info.audio.num_pins; i++) +- dce_v10_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false); +- + adev->mode_info.audio.enabled = false; + } + +--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +@@ -1508,17 +1508,12 @@ static int dce_v11_0_audio_init(struct a + + static void dce_v11_0_audio_fini(struct amdgpu_device *adev) + { +- int i; +- + if (!amdgpu_audio) + return; + + if (!adev->mode_info.audio.enabled) + return; + +- for (i = 0; i < adev->mode_info.audio.num_pins; i++) +- dce_v11_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false); +- + adev->mode_info.audio.enabled = false; + } + +--- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +@@ -1377,17 +1377,12 @@ static int dce_v6_0_audio_init(struct am + + static void dce_v6_0_audio_fini(struct amdgpu_device *adev) + { +- int i; +- + if (!amdgpu_audio) + return; + + if (!adev->mode_info.audio.enabled) + return; + +- for (i = 0; i < adev->mode_info.audio.num_pins; i++) +- dce_v6_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false); +- + adev->mode_info.audio.enabled = false; + } + +--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +@@ -1426,17 +1426,12 @@ static int dce_v8_0_audio_init(struct am + + static void dce_v8_0_audio_fini(struct amdgpu_device *adev) + { +- int i; +- + if (!amdgpu_audio) + return; + + if (!adev->mode_info.audio.enabled) + return; + +- for (i = 0; i < adev->mode_info.audio.num_pins; i++) +- dce_v8_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false); +- + adev->mode_info.audio.enabled = false; + } + diff --git a/queue-6.6/e1000e-fix-heap-overflow-in-e1000_set_eeprom.patch b/queue-6.6/e1000e-fix-heap-overflow-in-e1000_set_eeprom.patch new file mode 100644 index 0000000000..b8d694b07c --- /dev/null +++ b/queue-6.6/e1000e-fix-heap-overflow-in-e1000_set_eeprom.patch @@ -0,0 +1,55 @@ +From 90fb7db49c6dbac961c6b8ebfd741141ffbc8545 Mon Sep 17 00:00:00 2001 +From: Vitaly Lifshits +Date: Sun, 17 Aug 2025 12:25:47 +0300 +Subject: e1000e: fix heap overflow in e1000_set_eeprom + +From: Vitaly Lifshits + +commit 90fb7db49c6dbac961c6b8ebfd741141ffbc8545 upstream. + +Fix a possible heap overflow in e1000_set_eeprom function by adding +input validation for the requested length of the change in the EEPROM. +In addition, change the variable type from int to size_t for better +code practices and rearrange declarations to RCT. + +Cc: stable@vger.kernel.org +Fixes: bc7f75fa9788 ("[E1000E]: New pci-express e1000 driver (currently for ICH9 devices only)") +Co-developed-by: Mikael Wessel +Signed-off-by: Mikael Wessel +Signed-off-by: Vitaly Lifshits +Tested-by: Mor Bar-Gabay +Signed-off-by: Tony Nguyen +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/intel/e1000e/ethtool.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +--- a/drivers/net/ethernet/intel/e1000e/ethtool.c ++++ b/drivers/net/ethernet/intel/e1000e/ethtool.c +@@ -567,12 +567,12 @@ static int e1000_set_eeprom(struct net_d + { + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; ++ size_t total_len, max_len; + u16 *eeprom_buff; +- void *ptr; +- int max_len; ++ int ret_val = 0; + int first_word; + int last_word; +- int ret_val = 0; ++ void *ptr; + u16 i; + + if (eeprom->len == 0) +@@ -587,6 +587,10 @@ static int e1000_set_eeprom(struct net_d + + max_len = hw->nvm.word_size * 2; + ++ if (check_add_overflow(eeprom->offset, eeprom->len, &total_len) || ++ total_len > max_len) ++ return -EFBIG; ++ + first_word = eeprom->offset >> 1; + last_word = (eeprom->offset + eeprom->len - 1) >> 1; + eeprom_buff = kmalloc(max_len, GFP_KERNEL); diff --git a/queue-6.6/net-pcs-rzn1-miic-correct-modctrl-register-offset.patch b/queue-6.6/net-pcs-rzn1-miic-correct-modctrl-register-offset.patch new file mode 100644 index 0000000000..da617ce86c --- /dev/null +++ b/queue-6.6/net-pcs-rzn1-miic-correct-modctrl-register-offset.patch @@ -0,0 +1,49 @@ +From a7195a3d67dace056af7ca65144a11874df79562 Mon Sep 17 00:00:00 2001 +From: Lad Prabhakar +Date: Mon, 1 Sep 2025 12:20:19 +0100 +Subject: net: pcs: rzn1-miic: Correct MODCTRL register offset + +From: Lad Prabhakar + +commit a7195a3d67dace056af7ca65144a11874df79562 upstream. + +Correct the Mode Control Register (MODCTRL) offset for RZ/N MIIC. +According to the R-IN Engine and Ethernet Peripherals Manual (Rev.1.30) +[0], Table 10.1 "Ethernet Accessory Register List", MODCTRL is at offset +0x8, not 0x20 as previously defined. + +Offset 0x20 actually maps to the Port Trigger Control Register (PTCTRL), +which controls PTP_MODE[3:0] and RGMII_CLKSEL[4]. Using this incorrect +definition prevented the driver from configuring the SW_MODE[4:0] bits +in MODCTRL, which control the internal connection of Ethernet ports. As +a result, the MIIC could not be switched into the correct mode, leading +to link setup failures and non-functional Ethernet ports on affected +systems. + +[0] https://www.renesas.com/en/document/mah/rzn1d-group-rzn1s-group-rzn1l-group-users-manual-r-engine-and-ethernet-peripherals?r=1054571 + +Fixes: 7dc54d3b8d91 ("net: pcs: add Renesas MII converter driver") +Cc: stable@kernel.org +Signed-off-by: Lad Prabhakar +Reviewed-by: Wolfram Sang +Reviewed-by: Russell King (Oracle) +Reviewed-by: Geert Uytterhoeven +Tested-by: Wolfram Sang +Link: https://patch.msgid.link/20250901112019.16278-1-prabhakar.mahadev-lad.rj@bp.renesas.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/pcs/pcs-rzn1-miic.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/pcs/pcs-rzn1-miic.c ++++ b/drivers/net/pcs/pcs-rzn1-miic.c +@@ -19,7 +19,7 @@ + #define MIIC_PRCMD 0x0 + #define MIIC_ESID_CODE 0x4 + +-#define MIIC_MODCTRL 0x20 ++#define MIIC_MODCTRL 0x8 + #define MIIC_MODCTRL_SW_MODE GENMASK(4, 0) + + #define MIIC_CONVCTRL(port) (0x100 + (port) * 4) diff --git a/queue-6.6/ocfs2-prevent-release-journal-inode-after-journal-shutdown.patch b/queue-6.6/ocfs2-prevent-release-journal-inode-after-journal-shutdown.patch new file mode 100644 index 0000000000..5ad421e850 --- /dev/null +++ b/queue-6.6/ocfs2-prevent-release-journal-inode-after-journal-shutdown.patch @@ -0,0 +1,58 @@ +From f46e8ef8bb7b452584f2e75337b619ac51a7cadf Mon Sep 17 00:00:00 2001 +From: Edward Adam Davis +Date: Tue, 19 Aug 2025 21:41:02 +0800 +Subject: ocfs2: prevent release journal inode after journal shutdown + +From: Edward Adam Davis + +commit f46e8ef8bb7b452584f2e75337b619ac51a7cadf upstream. + +Before calling ocfs2_delete_osb(), ocfs2_journal_shutdown() has already +been executed in ocfs2_dismount_volume(), so osb->journal must be NULL. +Therefore, the following calltrace will inevitably fail when it reaches +jbd2_journal_release_jbd_inode(). + +ocfs2_dismount_volume()-> + ocfs2_delete_osb()-> + ocfs2_free_slot_info()-> + __ocfs2_free_slot_info()-> + evict()-> + ocfs2_evict_inode()-> + ocfs2_clear_inode()-> + jbd2_journal_release_jbd_inode(osb->journal->j_journal, + +Adding osb->journal checks will prevent null-ptr-deref during the above +execution path. + +Link: https://lkml.kernel.org/r/tencent_357489BEAEE4AED74CBD67D246DBD2C4C606@qq.com +Fixes: da5e7c87827e ("ocfs2: cleanup journal init and shutdown") +Signed-off-by: Edward Adam Davis +Reported-by: syzbot+47d8cb2f2cc1517e515a@syzkaller.appspotmail.com +Closes: https://syzkaller.appspot.com/bug?extid=47d8cb2f2cc1517e515a +Tested-by: syzbot+47d8cb2f2cc1517e515a@syzkaller.appspotmail.com +Reviewed-by: Mark Tinguely +Reviewed-by: Joseph Qi +Cc: Mark Fasheh +Cc: Joel Becker +Cc: Junxiao Bi +Cc: Changwei Ge +Cc: Jun Piao +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Greg Kroah-Hartman +--- + fs/ocfs2/inode.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/fs/ocfs2/inode.c ++++ b/fs/ocfs2/inode.c +@@ -1205,6 +1205,9 @@ static void ocfs2_clear_inode(struct ino + * the journal is flushed before journal shutdown. Thus it is safe to + * have inodes get cleaned up after journal shutdown. + */ ++ if (!osb->journal) ++ return; ++ + jbd2_journal_release_jbd_inode(osb->journal->j_journal, + &oi->ip_jinode); + } diff --git a/queue-6.6/platform-x86-amd-pmc-add-tuxedo-ib-pro-gen10-amd-to-spurious-8042-quirks-list.patch b/queue-6.6/platform-x86-amd-pmc-add-tuxedo-ib-pro-gen10-amd-to-spurious-8042-quirks-list.patch new file mode 100644 index 0000000000..2d8bc29ab2 --- /dev/null +++ b/queue-6.6/platform-x86-amd-pmc-add-tuxedo-ib-pro-gen10-amd-to-spurious-8042-quirks-list.patch @@ -0,0 +1,52 @@ +From c96f86217bb28e019403bb8f59eacd8ad5a7ad1a Mon Sep 17 00:00:00 2001 +From: Christoffer Sandberg +Date: Wed, 27 Aug 2025 15:13:51 +0200 +Subject: platform/x86/amd/pmc: Add TUXEDO IB Pro Gen10 AMD to spurious 8042 quirks list +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Christoffer Sandberg + +commit c96f86217bb28e019403bb8f59eacd8ad5a7ad1a upstream. + +Prevents instant wakeup ~1s after suspend. + +It seems to be kernel/system dependent if the IRQ actually manages to wake +the system every time or if it gets ignored (and everything works as +expected). + +Signed-off-by: Christoffer Sandberg +Signed-off-by: Werner Sembach +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20250827131424.16436-1-wse@tuxedocomputers.com +Reviewed-by: Ilpo Järvinen +Signed-off-by: Ilpo Järvinen +Signed-off-by: Greg Kroah-Hartman +--- + drivers/platform/x86/amd/pmc/pmc-quirks.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +--- a/drivers/platform/x86/amd/pmc/pmc-quirks.c ++++ b/drivers/platform/x86/amd/pmc/pmc-quirks.c +@@ -242,6 +242,20 @@ static const struct dmi_system_id fwbug_ + DMI_MATCH(DMI_PRODUCT_NAME, "Lafite Pro V 14M"), + } + }, ++ { ++ .ident = "TUXEDO InfinityBook Pro 14/15 AMD Gen10", ++ .driver_data = &quirk_spurious_8042, ++ .matches = { ++ DMI_MATCH(DMI_BOARD_NAME, "XxHP4NAx"), ++ } ++ }, ++ { ++ .ident = "TUXEDO InfinityBook Pro 14/15 AMD Gen10", ++ .driver_data = &quirk_spurious_8042, ++ .matches = { ++ DMI_MATCH(DMI_BOARD_NAME, "XxKK4NAx_XxSP4NAx"), ++ } ++ }, + {} + }; + diff --git a/queue-6.6/proc-fix-missing-pde_set_flags-for-net-proc-files.patch b/queue-6.6/proc-fix-missing-pde_set_flags-for-net-proc-files.patch new file mode 100644 index 0000000000..5e60019c26 --- /dev/null +++ b/queue-6.6/proc-fix-missing-pde_set_flags-for-net-proc-files.patch @@ -0,0 +1,132 @@ +From 2ce3d282bd5050fca8577defeff08ada0d55d062 Mon Sep 17 00:00:00 2001 +From: wangzijie +Date: Mon, 18 Aug 2025 20:31:02 +0800 +Subject: proc: fix missing pde_set_flags() for net proc files +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: wangzijie + +commit 2ce3d282bd5050fca8577defeff08ada0d55d062 upstream. + +To avoid potential UAF issues during module removal races, we use +pde_set_flags() to save proc_ops flags in PDE itself before +proc_register(), and then use pde_has_proc_*() helpers instead of directly +dereferencing pde->proc_ops->*. + +However, the pde_set_flags() call was missing when creating net related +proc files. This omission caused incorrect behavior which FMODE_LSEEK was +being cleared inappropriately in proc_reg_open() for net proc files. Lars +reported it in this link[1]. + +Fix this by ensuring pde_set_flags() is called when register proc entry, +and add NULL check for proc_ops in pde_set_flags(). + +[wangzijie1@honor.com: stash pde->proc_ops in a local const variable, per Christian] + Link: https://lkml.kernel.org/r/20250821105806.1453833-1-wangzijie1@honor.com +Link: https://lkml.kernel.org/r/20250818123102.959595-1-wangzijie1@honor.com +Link: https://lore.kernel.org/all/20250815195616.64497967@chagall.paradoxon.rec/ [1] +Fixes: ff7ec8dc1b64 ("proc: use the same treatment to check proc_lseek as ones for proc_read_iter et.al") +Signed-off-by: wangzijie +Reported-by: Lars Wendler +Tested-by: Stefano Brivio +Tested-by: Petr Vaněk +Tested by: Lars Wendler +Cc: Alexei Starovoitov +Cc: Alexey Dobriyan +Cc: Al Viro +Cc: "Edgecombe, Rick P" +Cc: Greg Kroah-Hartman +Cc: Jiri Slaby +Cc: Kirill A. Shutemov +Cc: wangzijie +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Greg Kroah-Hartman +--- + fs/proc/generic.c | 38 +++++++++++++++++++++----------------- + 1 file changed, 21 insertions(+), 17 deletions(-) + +--- a/fs/proc/generic.c ++++ b/fs/proc/generic.c +@@ -362,6 +362,25 @@ static const struct inode_operations pro + .setattr = proc_notify_change, + }; + ++static void pde_set_flags(struct proc_dir_entry *pde) ++{ ++ const struct proc_ops *proc_ops = pde->proc_ops; ++ ++ if (!proc_ops) ++ return; ++ ++ if (proc_ops->proc_flags & PROC_ENTRY_PERMANENT) ++ pde->flags |= PROC_ENTRY_PERMANENT; ++ if (proc_ops->proc_read_iter) ++ pde->flags |= PROC_ENTRY_proc_read_iter; ++#ifdef CONFIG_COMPAT ++ if (proc_ops->proc_compat_ioctl) ++ pde->flags |= PROC_ENTRY_proc_compat_ioctl; ++#endif ++ if (proc_ops->proc_lseek) ++ pde->flags |= PROC_ENTRY_proc_lseek; ++} ++ + /* returns the registered entry, or frees dp and returns NULL on failure */ + struct proc_dir_entry *proc_register(struct proc_dir_entry *dir, + struct proc_dir_entry *dp) +@@ -369,6 +388,8 @@ struct proc_dir_entry *proc_register(str + if (proc_alloc_inum(&dp->low_ino)) + goto out_free_entry; + ++ pde_set_flags(dp); ++ + write_lock(&proc_subdir_lock); + dp->parent = dir; + if (pde_subdir_insert(dir, dp) == false) { +@@ -557,20 +578,6 @@ struct proc_dir_entry *proc_create_reg(c + return p; + } + +-static void pde_set_flags(struct proc_dir_entry *pde) +-{ +- if (pde->proc_ops->proc_flags & PROC_ENTRY_PERMANENT) +- pde->flags |= PROC_ENTRY_PERMANENT; +- if (pde->proc_ops->proc_read_iter) +- pde->flags |= PROC_ENTRY_proc_read_iter; +-#ifdef CONFIG_COMPAT +- if (pde->proc_ops->proc_compat_ioctl) +- pde->flags |= PROC_ENTRY_proc_compat_ioctl; +-#endif +- if (pde->proc_ops->proc_lseek) +- pde->flags |= PROC_ENTRY_proc_lseek; +-} +- + struct proc_dir_entry *proc_create_data(const char *name, umode_t mode, + struct proc_dir_entry *parent, + const struct proc_ops *proc_ops, void *data) +@@ -581,7 +588,6 @@ struct proc_dir_entry *proc_create_data( + if (!p) + return NULL; + p->proc_ops = proc_ops; +- pde_set_flags(p); + return proc_register(parent, p); + } + EXPORT_SYMBOL(proc_create_data); +@@ -632,7 +638,6 @@ struct proc_dir_entry *proc_create_seq_p + p->proc_ops = &proc_seq_ops; + p->seq_ops = ops; + p->state_size = state_size; +- pde_set_flags(p); + return proc_register(parent, p); + } + EXPORT_SYMBOL(proc_create_seq_private); +@@ -663,7 +668,6 @@ struct proc_dir_entry *proc_create_singl + return NULL; + p->proc_ops = &proc_single_ops; + p->single_show = show; +- pde_set_flags(p); + return proc_register(parent, p); + } + EXPORT_SYMBOL(proc_create_single_data); diff --git a/queue-6.6/sched-fix-sched_numa_find_nth_cpu-if-mask-offline.patch b/queue-6.6/sched-fix-sched_numa_find_nth_cpu-if-mask-offline.patch new file mode 100644 index 0000000000..b7d3e525b9 --- /dev/null +++ b/queue-6.6/sched-fix-sched_numa_find_nth_cpu-if-mask-offline.patch @@ -0,0 +1,110 @@ +From 5ebf512f335053a42482ebff91e46c6dc156bf8c Mon Sep 17 00:00:00 2001 +From: Christian Loehle +Date: Wed, 3 Sep 2025 16:48:32 +0100 +Subject: sched: Fix sched_numa_find_nth_cpu() if mask offline + +From: Christian Loehle + +commit 5ebf512f335053a42482ebff91e46c6dc156bf8c upstream. + +sched_numa_find_nth_cpu() uses a bsearch to look for the 'closest' +CPU in sched_domains_numa_masks and given cpus mask. However they +might not intersect if all CPUs in the cpus mask are offline. bsearch +will return NULL in that case, bail out instead of dereferencing a +bogus pointer. + +The previous behaviour lead to this bug when using maxcpus=4 on an +rk3399 (LLLLbb) (i.e. booting with all big CPUs offline): + +[ 1.422922] Unable to handle kernel paging request at virtual address ffffff8000000000 +[ 1.423635] Mem abort info: +[ 1.423889] ESR = 0x0000000096000006 +[ 1.424227] EC = 0x25: DABT (current EL), IL = 32 bits +[ 1.424715] SET = 0, FnV = 0 +[ 1.424995] EA = 0, S1PTW = 0 +[ 1.425279] FSC = 0x06: level 2 translation fault +[ 1.425735] Data abort info: +[ 1.425998] ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000 +[ 1.426499] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 +[ 1.426952] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 +[ 1.427428] swapper pgtable: 4k pages, 39-bit VAs, pgdp=0000000004a9f000 +[ 1.428038] [ffffff8000000000] pgd=18000000f7fff403, p4d=18000000f7fff403, pud=18000000f7fff403, pmd=0000000000000000 +[ 1.429014] Internal error: Oops: 0000000096000006 [#1] SMP +[ 1.429525] Modules linked in: +[ 1.429813] CPU: 3 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.17.0-rc4-dirty #343 PREEMPT +[ 1.430559] Hardware name: Pine64 RockPro64 v2.1 (DT) +[ 1.431012] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) +[ 1.431634] pc : sched_numa_find_nth_cpu+0x2a0/0x488 +[ 1.432094] lr : sched_numa_find_nth_cpu+0x284/0x488 +[ 1.432543] sp : ffffffc084e1b960 +[ 1.432843] x29: ffffffc084e1b960 x28: ffffff80078a8800 x27: ffffffc0846eb1d0 +[ 1.433495] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000 +[ 1.434144] x23: 0000000000000000 x22: fffffffffff7f093 x21: ffffffc081de6378 +[ 1.434792] x20: 0000000000000000 x19: 0000000ffff7f093 x18: 00000000ffffffff +[ 1.435441] x17: 3030303866666666 x16: 66663d736b73616d x15: ffffffc104e1b5b7 +[ 1.436091] x14: 0000000000000000 x13: ffffffc084712860 x12: 0000000000000372 +[ 1.436739] x11: 0000000000000126 x10: ffffffc08476a860 x9 : ffffffc084712860 +[ 1.437389] x8 : 00000000ffffefff x7 : ffffffc08476a860 x6 : 0000000000000000 +[ 1.438036] x5 : 000000000000bff4 x4 : 0000000000000000 x3 : 0000000000000000 +[ 1.438683] x2 : 0000000000000000 x1 : ffffffc0846eb000 x0 : ffffff8000407b68 +[ 1.439332] Call trace: +[ 1.439559] sched_numa_find_nth_cpu+0x2a0/0x488 (P) +[ 1.440016] smp_call_function_any+0xc8/0xd0 +[ 1.440416] armv8_pmu_init+0x58/0x27c +[ 1.440770] armv8_cortex_a72_pmu_init+0x20/0x2c +[ 1.441199] arm_pmu_device_probe+0x1e4/0x5e8 +[ 1.441603] armv8_pmu_device_probe+0x1c/0x28 +[ 1.442007] platform_probe+0x5c/0xac +[ 1.442347] really_probe+0xbc/0x298 +[ 1.442683] __driver_probe_device+0x78/0x12c +[ 1.443087] driver_probe_device+0xdc/0x160 +[ 1.443475] __driver_attach+0x94/0x19c +[ 1.443833] bus_for_each_dev+0x74/0xd4 +[ 1.444190] driver_attach+0x24/0x30 +[ 1.444525] bus_add_driver+0xe4/0x208 +[ 1.444874] driver_register+0x60/0x128 +[ 1.445233] __platform_driver_register+0x24/0x30 +[ 1.445662] armv8_pmu_driver_init+0x28/0x4c +[ 1.446059] do_one_initcall+0x44/0x25c +[ 1.446416] kernel_init_freeable+0x1dc/0x3bc +[ 1.446820] kernel_init+0x20/0x1d8 +[ 1.447151] ret_from_fork+0x10/0x20 +[ 1.447493] Code: 90022e21 f000e5f5 910de2b5 2a1703e2 (f8767803) +[ 1.448040] ---[ end trace 0000000000000000 ]--- +[ 1.448483] note: swapper/0[1] exited with preempt_count 1 +[ 1.449047] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b +[ 1.449741] SMP: stopping secondary CPUs +[ 1.450105] Kernel Offset: disabled +[ 1.450419] CPU features: 0x000000,00080000,20002001,0400421b +[ 1.450935] Memory Limit: none +[ 1.451217] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b ]--- + +Yury: with the fix, the function returns cpu == nr_cpu_ids, and later in + + smp_call_function_any -> + smp_call_function_single -> + generic_exec_single + +we test the cpu for '>= nr_cpu_ids' and return -ENXIO. So everything is +handled correctly. + +Fixes: cd7f55359c90 ("sched: add sched_numa_find_nth_cpu()") +Cc: stable@vger.kernel.org +Signed-off-by: Christian Loehle +Signed-off-by: Yury Norov (NVIDIA) +Signed-off-by: Greg Kroah-Hartman +--- + kernel/sched/topology.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/kernel/sched/topology.c ++++ b/kernel/sched/topology.c +@@ -2140,6 +2140,8 @@ int sched_numa_find_nth_cpu(const struct + goto unlock; + + hop_masks = bsearch(&k, k.masks, sched_domains_numa_levels, sizeof(k.masks[0]), hop_cmp); ++ if (!hop_masks) ++ goto unlock; + hop = hop_masks - k.masks; + + ret = hop ? diff --git a/queue-6.6/scsi-lpfc-fix-buffer-free-clear-order-in-deferred-receive-path.patch b/queue-6.6/scsi-lpfc-fix-buffer-free-clear-order-in-deferred-receive-path.patch new file mode 100644 index 0000000000..88c5bfb37a --- /dev/null +++ b/queue-6.6/scsi-lpfc-fix-buffer-free-clear-order-in-deferred-receive-path.patch @@ -0,0 +1,70 @@ +From 9dba9a45c348e8460da97c450cddf70b2056deb3 Mon Sep 17 00:00:00 2001 +From: John Evans +Date: Thu, 28 Aug 2025 12:40:08 +0800 +Subject: scsi: lpfc: Fix buffer free/clear order in deferred receive path + +From: John Evans + +commit 9dba9a45c348e8460da97c450cddf70b2056deb3 upstream. + +Fix a use-after-free window by correcting the buffer release sequence in +the deferred receive path. The code freed the RQ buffer first and only +then cleared the context pointer under the lock. Concurrent paths (e.g., +ABTS and the repost path) also inspect and release the same pointer under +the lock, so the old order could lead to double-free/UAF. + +Note that the repost path already uses the correct pattern: detach the +pointer under the lock, then free it after dropping the lock. The +deferred path should do the same. + +Fixes: 472e146d1cf3 ("scsi: lpfc: Correct upcalling nvmet_fc transport during io done downcall") +Cc: stable@vger.kernel.org +Signed-off-by: John Evans +Link: https://lore.kernel.org/r/20250828044008.743-1-evans1210144@gmail.com +Reviewed-by: Justin Tee +Signed-off-by: Martin K. Petersen +Signed-off-by: Greg Kroah-Hartman +--- + drivers/scsi/lpfc/lpfc_nvmet.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +--- a/drivers/scsi/lpfc/lpfc_nvmet.c ++++ b/drivers/scsi/lpfc/lpfc_nvmet.c +@@ -1243,7 +1243,7 @@ lpfc_nvmet_defer_rcv(struct nvmet_fc_tar + struct lpfc_nvmet_tgtport *tgtp; + struct lpfc_async_xchg_ctx *ctxp = + container_of(rsp, struct lpfc_async_xchg_ctx, hdlrctx.fcp_req); +- struct rqb_dmabuf *nvmebuf = ctxp->rqb_buffer; ++ struct rqb_dmabuf *nvmebuf; + struct lpfc_hba *phba = ctxp->phba; + unsigned long iflag; + +@@ -1251,13 +1251,18 @@ lpfc_nvmet_defer_rcv(struct nvmet_fc_tar + lpfc_nvmeio_data(phba, "NVMET DEFERRCV: xri x%x sz %d CPU %02x\n", + ctxp->oxid, ctxp->size, raw_smp_processor_id()); + ++ spin_lock_irqsave(&ctxp->ctxlock, iflag); ++ nvmebuf = ctxp->rqb_buffer; + if (!nvmebuf) { ++ spin_unlock_irqrestore(&ctxp->ctxlock, iflag); + lpfc_printf_log(phba, KERN_INFO, LOG_NVME_IOERR, + "6425 Defer rcv: no buffer oxid x%x: " + "flg %x ste %x\n", + ctxp->oxid, ctxp->flag, ctxp->state); + return; + } ++ ctxp->rqb_buffer = NULL; ++ spin_unlock_irqrestore(&ctxp->ctxlock, iflag); + + tgtp = phba->targetport->private; + if (tgtp) +@@ -1265,9 +1270,6 @@ lpfc_nvmet_defer_rcv(struct nvmet_fc_tar + + /* Free the nvmebuf since a new buffer already replaced it */ + nvmebuf->hrq->rqbp->rqb_free_buffer(phba, nvmebuf); +- spin_lock_irqsave(&ctxp->ctxlock, iflag); +- ctxp->rqb_buffer = NULL; +- spin_unlock_irqrestore(&ctxp->ctxlock, iflag); + } + + /** diff --git a/queue-6.6/series b/queue-6.6/series index 46aff5c565..fe9ee70459 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -54,3 +54,16 @@ arm64-ftrace-fix-unreachable-plt-for-ftrace_caller-in-init_module-with-config_dy pcmcia-fix-a-null-pointer-dereference-in-__iodyn_find_io_region.patch x86-mm-64-define-arch_page_table_sync_mask-and-arch_sync_kernel_mappings.patch mm-move-page-table-sync-declarations-to-linux-pgtable.h.patch +sched-fix-sched_numa_find_nth_cpu-if-mask-offline.patch +ocfs2-prevent-release-journal-inode-after-journal-shutdown.patch +proc-fix-missing-pde_set_flags-for-net-proc-files.patch +soc-qcom-mdt_loader-deal-with-zero-e_shentsize.patch +wifi-mwifiex-initialize-the-chan_stats-array-to-zero.patch +wifi-mt76-mt7996-initialize-hdr-before-passing-to-skb_put_data.patch +drm-amdgpu-drop-hw-access-in-non-dc-audio-fini.patch +platform-x86-amd-pmc-add-tuxedo-ib-pro-gen10-amd-to-spurious-8042-quirks-list.patch +scsi-lpfc-fix-buffer-free-clear-order-in-deferred-receive-path.patch +batman-adv-fix-oob-read-write-in-network-coding-decode.patch +cifs-prevent-null-pointer-dereference-in-utf16-conversion.patch +e1000e-fix-heap-overflow-in-e1000_set_eeprom.patch +net-pcs-rzn1-miic-correct-modctrl-register-offset.patch diff --git a/queue-6.6/soc-qcom-mdt_loader-deal-with-zero-e_shentsize.patch b/queue-6.6/soc-qcom-mdt_loader-deal-with-zero-e_shentsize.patch new file mode 100644 index 0000000000..e7e9955f5b --- /dev/null +++ b/queue-6.6/soc-qcom-mdt_loader-deal-with-zero-e_shentsize.patch @@ -0,0 +1,55 @@ +From 25daf9af0ac1bf12490b723b5efaf8dcc85980bc Mon Sep 17 00:00:00 2001 +From: Bjorn Andersson +Date: Wed, 30 Jul 2025 15:51:51 -0500 +Subject: soc: qcom: mdt_loader: Deal with zero e_shentsize + +From: Bjorn Andersson + +commit 25daf9af0ac1bf12490b723b5efaf8dcc85980bc upstream. + +Firmware that doesn't provide section headers leave both e_shentsize and +e_shnum 0, which obvious isn't compatible with the newly introduced +stricter checks. + +Make the section-related checks conditional on either of these values +being non-zero. + +Fixes: 9f9967fed9d0 ("soc: qcom: mdt_loader: Ensure we don't read past the ELF header") +Reported-by: Val Packett +Closes: https://lore.kernel.org/all/ece307c3-7d65-440f-babd-88cf9705b908@packett.cool/ +Reported-by: Neil Armstrong +Closes: https://lore.kernel.org/all/aec9cd03-6fc2-4dc8-b937-8b7cf7bf4128@linaro.org/ +Signed-off-by: Bjorn Andersson +Fixes: 9f35ab0e53cc ("soc: qcom: mdt_loader: Fix error return values in mdt_header_valid()") +Tested-by: Neil Armstrong # on SM8650-QRD +Reviewed-by: Dmitry Baryshkov +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20250730-mdt-loader-shentsize-zero-v1-1-04f43186229c@oss.qualcomm.com +Signed-off-by: Bjorn Andersson +Signed-off-by: Greg Kroah-Hartman +--- + drivers/soc/qcom/mdt_loader.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +--- a/drivers/soc/qcom/mdt_loader.c ++++ b/drivers/soc/qcom/mdt_loader.c +@@ -38,12 +38,14 @@ static bool mdt_header_valid(const struc + if (phend > fw->size) + return false; + +- if (ehdr->e_shentsize != sizeof(struct elf32_shdr)) +- return false; ++ if (ehdr->e_shentsize || ehdr->e_shnum) { ++ if (ehdr->e_shentsize != sizeof(struct elf32_shdr)) ++ return false; + +- shend = size_add(size_mul(sizeof(struct elf32_shdr), ehdr->e_shnum), ehdr->e_shoff); +- if (shend > fw->size) +- return false; ++ shend = size_add(size_mul(sizeof(struct elf32_shdr), ehdr->e_shnum), ehdr->e_shoff); ++ if (shend > fw->size) ++ return false; ++ } + + return true; + } diff --git a/queue-6.6/wifi-mt76-mt7996-initialize-hdr-before-passing-to-skb_put_data.patch b/queue-6.6/wifi-mt76-mt7996-initialize-hdr-before-passing-to-skb_put_data.patch new file mode 100644 index 0000000000..c3db333a10 --- /dev/null +++ b/queue-6.6/wifi-mt76-mt7996-initialize-hdr-before-passing-to-skb_put_data.patch @@ -0,0 +1,55 @@ +From 87b07a1fbc6b5c23d3b3584ab4288bc9106d3274 Mon Sep 17 00:00:00 2001 +From: Nathan Chancellor +Date: Tue, 15 Jul 2025 15:33:25 -0700 +Subject: wifi: mt76: mt7996: Initialize hdr before passing to skb_put_data() + +From: Nathan Chancellor + +commit 87b07a1fbc6b5c23d3b3584ab4288bc9106d3274 upstream. + +A new warning in clang [1] points out a couple of places where a hdr +variable is not initialized then passed along to skb_put_data(). + + drivers/net/wireless/mediatek/mt76/mt7996/mcu.c:1894:21: warning: variable 'hdr' is uninitialized when passed as a const pointer argument here [-Wuninitialized-const-pointer] + 1894 | skb_put_data(skb, &hdr, sizeof(hdr)); + | ^~~ + drivers/net/wireless/mediatek/mt76/mt7996/mcu.c:3386:21: warning: variable 'hdr' is uninitialized when passed as a const pointer argument here [-Wuninitialized-const-pointer] + 3386 | skb_put_data(skb, &hdr, sizeof(hdr)); + | ^~~ + +Zero initialize these headers as done in other places in the driver when +there is nothing stored in the header. + +Cc: stable@vger.kernel.org +Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices") +Link: https://github.com/llvm/llvm-project/commit/00dacf8c22f065cb52efb14cd091d441f19b319e [1] +Closes: https://github.com/ClangBuiltLinux/linux/issues/2104 +Signed-off-by: Nathan Chancellor +Link: https://patch.msgid.link/20250715-mt7996-fix-uninit-const-pointer-v1-1-b5d8d11d7b78@kernel.org +Signed-off-by: Felix Fietkau +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c ++++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +@@ -1616,8 +1616,8 @@ mt7996_mcu_get_mmps_mode(enum ieee80211_ + int mt7996_mcu_set_fixed_rate_ctrl(struct mt7996_dev *dev, + void *data, u16 version) + { ++ struct uni_header hdr = {}; + struct ra_fixed_rate *req; +- struct uni_header hdr; + struct sk_buff *skb; + struct tlv *tlv; + int len; +@@ -2638,7 +2638,7 @@ int mt7996_mcu_set_hdr_trans(struct mt79 + { + struct { + u8 __rsv[4]; +- } __packed hdr; ++ } __packed hdr = {}; + struct hdr_trans_blacklist *req_blacklist; + struct hdr_trans_en *req_en; + struct sk_buff *skb; diff --git a/queue-6.6/wifi-mwifiex-initialize-the-chan_stats-array-to-zero.patch b/queue-6.6/wifi-mwifiex-initialize-the-chan_stats-array-to-zero.patch new file mode 100644 index 0000000000..4c9ddc50ed --- /dev/null +++ b/queue-6.6/wifi-mwifiex-initialize-the-chan_stats-array-to-zero.patch @@ -0,0 +1,70 @@ +From 0e20450829ca3c1dbc2db536391537c57a40fe0b Mon Sep 17 00:00:00 2001 +From: Qianfeng Rong +Date: Fri, 15 Aug 2025 10:30:50 +0800 +Subject: wifi: mwifiex: Initialize the chan_stats array to zero + +From: Qianfeng Rong + +commit 0e20450829ca3c1dbc2db536391537c57a40fe0b upstream. + +The adapter->chan_stats[] array is initialized in +mwifiex_init_channel_scan_gap() with vmalloc(), which doesn't zero out +memory. The array is filled in mwifiex_update_chan_statistics() +and then the user can query the data in mwifiex_cfg80211_dump_survey(). + +There are two potential issues here. What if the user calls +mwifiex_cfg80211_dump_survey() before the data has been filled in. +Also the mwifiex_update_chan_statistics() function doesn't necessarily +initialize the whole array. Since the array was not initialized at +the start that could result in an information leak. + +Also this array is pretty small. It's a maximum of 900 bytes so it's +more appropriate to use kcalloc() instead vmalloc(). + +Cc: stable@vger.kernel.org +Fixes: bf35443314ac ("mwifiex: channel statistics support for mwifiex") +Suggested-by: Dan Carpenter +Signed-off-by: Qianfeng Rong +Reviewed-by: Dan Carpenter +Link: https://patch.msgid.link/20250815023055.477719-1-rongqianfeng@vivo.com +Signed-off-by: Johannes Berg +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/wireless/marvell/mwifiex/cfg80211.c | 5 +++-- + drivers/net/wireless/marvell/mwifiex/main.c | 4 ++-- + 2 files changed, 5 insertions(+), 4 deletions(-) + +--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c ++++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c +@@ -4316,8 +4316,9 @@ int mwifiex_init_channel_scan_gap(struct + * additional active scan request for hidden SSIDs on passive channels. + */ + adapter->num_in_chan_stats = 2 * (n_channels_bg + n_channels_a); +- adapter->chan_stats = vmalloc(array_size(sizeof(*adapter->chan_stats), +- adapter->num_in_chan_stats)); ++ adapter->chan_stats = kcalloc(adapter->num_in_chan_stats, ++ sizeof(*adapter->chan_stats), ++ GFP_KERNEL); + + if (!adapter->chan_stats) + return -ENOMEM; +--- a/drivers/net/wireless/marvell/mwifiex/main.c ++++ b/drivers/net/wireless/marvell/mwifiex/main.c +@@ -664,7 +664,7 @@ static int _mwifiex_fw_dpc(const struct + goto done; + + err_add_intf: +- vfree(adapter->chan_stats); ++ kfree(adapter->chan_stats); + err_init_chan_scan: + wiphy_unregister(adapter->wiphy); + wiphy_free(adapter->wiphy); +@@ -1481,7 +1481,7 @@ static void mwifiex_uninit_sw(struct mwi + wiphy_free(adapter->wiphy); + adapter->wiphy = NULL; + +- vfree(adapter->chan_stats); ++ kfree(adapter->chan_stats); + mwifiex_free_cmd_buffers(adapter); + } +