Commit 8c14f9c70327 ("ARCNET: add com20020 PCI IDs with metadata") converted the com20020-pci driver to use a card info structure instead of a single flag mask in driver_data. However, it failed to take into account that in the original code, driver_data of 0 indicates a card with no special flags, not a card that should not have any card info structure. This introduced a null pointer dereference when cards with no flags were probed. Commit bd6f1fd5d33d ("net: arcnet: com20020: Fix null-ptr-deref in com20020pci_probe()") then papered over this issue by rejecting cards with no driver_data instead of resolving the problem at its source. Revert the incorrect fix and fix the original issue by introducing a new card info structure for 2.5Mbit cards that does not set any flags. Fixes: 8c14f9c70327 ("ARCNET: add com20020 PCI IDs with metadata") Fixes: bd6f1fd5d33d ("net: arcnet: com20020: Fix null-ptr-deref in com20020pci_probe()") Cc: stable@vger.kernel.org Reviewed-by: Simon Horman Signed-off-by: Ethan Nelson-Moore --- Changes from v1: Rebase on latest mainline instead of net-next Add received tag drivers/net/arcnet/com20020-pci.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/drivers/net/arcnet/com20020-pci.c b/drivers/net/arcnet/com20020-pci.c index 0472bcdff130..4847f40a2095 100644 --- a/drivers/net/arcnet/com20020-pci.c +++ b/drivers/net/arcnet/com20020-pci.c @@ -139,9 +139,6 @@ static int com20020pci_probe(struct pci_dev *pdev, return -ENOMEM; ci = (struct com20020_pci_card_info *)id->driver_data; - if (!ci) - return -EINVAL; - priv->ci = ci; mm = &ci->misc_map; @@ -347,6 +344,18 @@ static struct com20020_pci_card_info card_info_5mbit = { .flags = ARC_IS_5MBIT, }; +static struct com20020_pci_card_info card_info_2p5mbit = { + .name = "ARC-PCI", + .devcount = 1, + .chan_map_tbl = { + { + .bar = 2, + .offset = 0x00, + .size = 0x08, + }, + }, +}; + static struct com20020_pci_card_info card_info_sohard = { .name = "SOHARD SH ARC-PCI", .devcount = 1, @@ -448,49 +457,49 @@ static const struct pci_device_id com20020pci_id_table[] = { 0x1571, 0xa001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - 0, + (kernel_ulong_t)&card_info_2p5mbit }, { 0x1571, 0xa002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - 0, + (kernel_ulong_t)&card_info_2p5mbit }, { 0x1571, 0xa003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - 0 + (kernel_ulong_t)&card_info_2p5mbit }, { 0x1571, 0xa004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - 0, + (kernel_ulong_t)&card_info_2p5mbit }, { 0x1571, 0xa005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - 0 + (kernel_ulong_t)&card_info_2p5mbit }, { 0x1571, 0xa006, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - 0 + (kernel_ulong_t)&card_info_2p5mbit }, { 0x1571, 0xa007, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - 0 + (kernel_ulong_t)&card_info_2p5mbit }, { 0x1571, 0xa008, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - 0 + (kernel_ulong_t)&card_info_2p5mbit }, { 0x1571, 0xa009, -- 2.43.0