Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -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,0x5a,0xc0);
			WriteLPCReg(0x28, 0x70 );
			if (via_ircc_open(pcidev, &info, 0x3076) == 0)
				rc=0;
			rc = via_ircc_open(pcidev, &info, 0x3076);
		} else
			rc = -ENODEV; //IR not turn on	 
	} else { //Not VT1211
@@ -249,8 +248,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
			info.irq=FirIRQ;
			info.dma=FirDRQ1;
			info.dma2=FirDRQ0;
			if (via_ircc_open(pcidev, &info, 0x3096) == 0)
				rc=0;
			rc = via_ircc_open(pcidev, &info, 0x3096);
		} else
			rc = -ENODEV; //IR not turn on !!!!!
	}//Not VT1211