]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: endpoint: Verify that requested BAR size is a power of two
authorNiklas Cassel <cassel@kernel.org>
Fri, 13 Dec 2024 14:33:07 +0000 (15:33 +0100)
committerKrzysztof Wilczyński <kwilczynski@kernel.org>
Wed, 18 Dec 2024 21:52:16 +0000 (21:52 +0000)
When allocating a BAR using pci_epf_alloc_space(), there are checks that
round up the size to a power of two.

However, there is no check in pci_epc_set_bar() which verifies that the
requested BAR size is a power of two.

Add a power of two check in pci_epc_set_bar(), so that we don't need to
add such a check in each and every PCI endpoint controller driver.

Link: https://lore.kernel.org/r/20241213143301.4158431-14-cassel@kernel.org
Signed-off-by: Niklas Cassel <cassel@kernel.org>
Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
drivers/pci/endpoint/pci-epc-core.c

index 78cc7d47a7d425be9cb92935066cdc128ea2ce4c..9e9ca5f8e8f860a57d49ce62597b0f71ef6009ba 100644 (file)
@@ -613,6 +613,9 @@ int pci_epc_set_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
            (epc_features->bar[bar].fixed_size != epf_bar->size))
                return -EINVAL;
 
+       if (!is_power_of_2(epf_bar->size))
+               return -EINVAL;
+
        if ((epf_bar->barno == BAR_5 && flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ||
            (flags & PCI_BASE_ADDRESS_SPACE_IO &&
             flags & PCI_BASE_ADDRESS_IO_MASK) ||