Commit 18ebe5c1 authored by Alexey Khoroshilov's avatar Alexey Khoroshilov Committed by David S. Miller

via-ircc: don't return zero if via_ircc_open() failed

If via_ircc_open() fails, data structures of the driver left uninitialized,
but probe (via_init_one()) returns zero. That can lead to null pointer dereference
in via_remove_one(), since it does not check drvdata for NULL.

The patch implements proper error code propagation.

Found by Linux Driver Verification project (linuxtesting.org).
Signed-off-by: default avatarAlexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e5733321
...@@ -210,8 +210,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) ...@@ -210,8 +210,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
pci_write_config_byte(pcidev,0x42,(bTmp | 0xf0)); pci_write_config_byte(pcidev,0x42,(bTmp | 0xf0));
pci_write_config_byte(pcidev,0x5a,0xc0); pci_write_config_byte(pcidev,0x5a,0xc0);
WriteLPCReg(0x28, 0x70 ); WriteLPCReg(0x28, 0x70 );
if (via_ircc_open(pcidev, &info, 0x3076) == 0) rc = via_ircc_open(pcidev, &info, 0x3076);
rc=0;
} else } else
rc = -ENODEV; //IR not turn on rc = -ENODEV; //IR not turn on
} else { //Not VT1211 } else { //Not VT1211
...@@ -249,8 +248,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) ...@@ -249,8 +248,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
info.irq=FirIRQ; info.irq=FirIRQ;
info.dma=FirDRQ1; info.dma=FirDRQ1;
info.dma2=FirDRQ0; info.dma2=FirDRQ0;
if (via_ircc_open(pcidev, &info, 0x3096) == 0) rc = via_ircc_open(pcidev, &info, 0x3096);
rc=0;
} else } else
rc = -ENODEV; //IR not turn on !!!!! rc = -ENODEV; //IR not turn on !!!!!
}//Not VT1211 }//Not VT1211
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment