]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: cadence: Avoid signed 64-bit truncation and invalid sort
authorIan Rogers <irogers@google.com>
Tue, 9 Dec 2025 22:37:56 +0000 (14:37 -0800)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 26 Dec 2025 17:14:23 +0000 (11:14 -0600)
The cdns_pcie_host_dma_ranges_cmp() element comparison function used by
list_sort() is of type list_cmp_func_t, so it returns a 32-bit int.

cdns_pcie_host_dma_ranges_cmp() computes a resource_size_t difference that
may be a 64-bit value, and truncating that difference to a 32-bit return
value may change the sign and result in an invalid sort order.

Avoid the truncation and invalid sort order by returning -1, 0, or 1.

Signed-off-by: Ian Rogers <irogers@google.com>
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
[bhelgaas: commit log]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://patch.msgid.link/20251209223756.2321578-1-irogers@google.com
drivers/pci/controller/cadence/pcie-cadence-host-common.c

index 15415d7f35ee9c2fda2b5b2ad398297135641cd4..2b0211870f02ab559af0b237ec346f33f58c3b5d 100644 (file)
@@ -173,11 +173,21 @@ int cdns_pcie_host_dma_ranges_cmp(void *priv, const struct list_head *a,
                                  const struct list_head *b)
 {
        struct resource_entry *entry1, *entry2;
+       u64 size1, size2;
 
        entry1 = container_of(a, struct resource_entry, node);
        entry2 = container_of(b, struct resource_entry, node);
 
-       return resource_size(entry2->res) - resource_size(entry1->res);
+       size1 = resource_size(entry1->res);
+       size2 = resource_size(entry2->res);
+
+       if (size1 > size2)
+               return -1;
+
+       if (size1 < size2)
+               return 1;
+
+       return 0;
 }
 EXPORT_SYMBOL_GPL(cdns_pcie_host_dma_ranges_cmp);