From c6c03b01c33c524daf8b85cb3a578f155c4d445a Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 14 Jun 2022 00:30:14 -0400 Subject: [PATCH] freebsd_network: Validate ranges but not alignment when coalescing in bus_dma. --- src/libs/compat/freebsd_network/bus_dma.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libs/compat/freebsd_network/bus_dma.cpp b/src/libs/compat/freebsd_network/bus_dma.cpp index d11faddcf2..a65fbcd793 100644 --- a/src/libs/compat/freebsd_network/bus_dma.cpp +++ b/src/libs/compat/freebsd_network/bus_dma.cpp @@ -310,7 +310,7 @@ bus_dmamem_free(bus_dma_tag_t dmat, void* vaddr, bus_dmamap_t map) static bool -_validate_address(bus_dma_tag_t dmat, bus_addr_t paddr) +_validate_address(bus_dma_tag_t dmat, bus_addr_t paddr, bool validate_alignment = true) { do { if (dmat->filter != NULL) { @@ -319,7 +319,7 @@ _validate_address(bus_dma_tag_t dmat, bus_addr_t paddr) } else { if (paddr > dmat->lowaddr && paddr <= dmat->highaddr) return false; - if (!vm_addr_align_ok(paddr, dmat->alignment)) + if (validate_alignment && !vm_addr_align_ok(paddr, dmat->alignment)) return false; } @@ -360,7 +360,9 @@ _bus_load_buffer(bus_dma_tag_t dmat, void* buf, bus_size_t buflen, && (dmat->boundary == 0 || (segs[seg].ds_addr & boundary_mask) == (phys_addr & boundary_mask))) { - // No need to validate the address here. + if (!_validate_address(dmat, phys_addr, false)) + return ERANGE; + segs[seg].ds_len += segment_size; } else { if (first)