Message ID | 1455048677-19882-5-git-send-email-linux@rasmusvillemoes.dk |
---|---|
State | Awaiting Upstream, archived |
Delegated to: | David Miller |
Headers | show |
ping On Tue, Feb 09 2016, Rasmus Villemoes <linux@rasmusvillemoes.dk> wrote: > We need to use post-decrement to ensure that irq_dispose_mapping is > also called on priv->rxq[0]->irq_no; moreover, if one of the above for > loops failed already at i==0 (so we reach one of these labels with > that value of i), we'll enter an essentially infinite loop of > out-of-bounds accesses. > > Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> > --- > drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c > index b02eed12bfc5..73427e29df2a 100644 > --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c > +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c > @@ -155,11 +155,11 @@ static int sxgbe_platform_probe(struct platform_device *pdev) > return 0; > > err_rx_irq_unmap: > - while (--i) > + while (i--) > irq_dispose_mapping(priv->rxq[i]->irq_no); > i = SXGBE_TX_QUEUES; > err_tx_irq_unmap: > - while (--i) > + while (i--) > irq_dispose_mapping(priv->txq[i]->irq_no); > irq_dispose_mapping(priv->irq); > err_drv_remove:
ping^2 On Tue, Mar 08 2016, Rasmus Villemoes <linux@rasmusvillemoes.dk> wrote: > ping > > On Tue, Feb 09 2016, Rasmus Villemoes <linux@rasmusvillemoes.dk> wrote: > >> We need to use post-decrement to ensure that irq_dispose_mapping is >> also called on priv->rxq[0]->irq_no; moreover, if one of the above for >> loops failed already at i==0 (so we reach one of these labels with >> that value of i), we'll enter an essentially infinite loop of >> out-of-bounds accesses. >> >> Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> >> --- >> drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c >> index b02eed12bfc5..73427e29df2a 100644 >> --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c >> +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c >> @@ -155,11 +155,11 @@ static int sxgbe_platform_probe(struct platform_device *pdev) >> return 0; >> >> err_rx_irq_unmap: >> - while (--i) >> + while (i--) >> irq_dispose_mapping(priv->rxq[i]->irq_no); >> i = SXGBE_TX_QUEUES; >> err_tx_irq_unmap: >> - while (--i) >> + while (i--) >> irq_dispose_mapping(priv->txq[i]->irq_no); >> irq_dispose_mapping(priv->irq); >> err_drv_remove:
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c index b02eed12bfc5..73427e29df2a 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c @@ -155,11 +155,11 @@ static int sxgbe_platform_probe(struct platform_device *pdev) return 0; err_rx_irq_unmap: - while (--i) + while (i--) irq_dispose_mapping(priv->rxq[i]->irq_no); i = SXGBE_TX_QUEUES; err_tx_irq_unmap: - while (--i) + while (i--) irq_dispose_mapping(priv->txq[i]->irq_no); irq_dispose_mapping(priv->irq); err_drv_remove:
We need to use post-decrement to ensure that irq_dispose_mapping is also called on priv->rxq[0]->irq_no; moreover, if one of the above for loops failed already at i==0 (so we reach one of these labels with that value of i), we'll enter an essentially infinite loop of out-of-bounds accesses. Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> --- drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)