Patch "enetc: Fix illegal access when reading affinity_hint" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    enetc: Fix illegal access when reading affinity_hint

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     enetc-fix-illegal-access-when-reading-affinity_hint.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e0bc1ec9e376400a721dd74afd2382d08e69886d
Author: Claudiu Manoil <claudiu.manoil@xxxxxxx>
Date:   Fri Sep 17 13:22:05 2021 +0300

    enetc: Fix illegal access when reading affinity_hint
    
    [ Upstream commit 7237a494decfa17d0b9d0076e6cee3235719de90 ]
    
    irq_set_affinity_hit() stores a reference to the cpumask_t
    parameter in the irq descriptor, and that reference can be
    accessed later from irq_affinity_hint_proc_show(). Since
    the cpu_mask parameter passed to irq_set_affinity_hit() has
    only temporary storage (it's on the stack memory), later
    accesses to it are illegal. Thus reads from the corresponding
    procfs affinity_hint file can result in paging request oops.
    
    The issue is fixed by the get_cpu_mask() helper, which provides
    a permanent storage for the cpumask_t parameter.
    
    Fixes: d4fd0404c1c9 ("enetc: Introduce basic PF and VF ENETC ethernet drivers")
    Signed-off-by: Claudiu Manoil <claudiu.manoil@xxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index b77eaf31bd4e..cee77326e7e8 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -1222,7 +1222,6 @@ static void enetc_clear_bdrs(struct enetc_ndev_priv *priv)
 static int enetc_setup_irqs(struct enetc_ndev_priv *priv)
 {
 	struct pci_dev *pdev = priv->si->pdev;
-	cpumask_t cpu_mask;
 	int i, j, err;
 
 	for (i = 0; i < priv->bdr_int_num; i++) {
@@ -1249,9 +1248,7 @@ static int enetc_setup_irqs(struct enetc_ndev_priv *priv)
 
 			enetc_wr(hw, ENETC_SIMSITRV(idx), entry);
 		}
-		cpumask_clear(&cpu_mask);
-		cpumask_set_cpu(i % num_online_cpus(), &cpu_mask);
-		irq_set_affinity_hint(irq, &cpu_mask);
+		irq_set_affinity_hint(irq, get_cpu_mask(i % num_online_cpus()));
 	}
 
 	return 0;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux