Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 12:29:47 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/instmem:
            nouveau_nvkm_subdev_instmem_gk20a.c
        src/sys/external/bsd/drm2/dist/drm/via: via_dmablit.c

Log Message:
drm: Avoid potential integer overflow in pages->bytes conversion.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 \
    
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/instmem/nouveau_nvkm_subdev_instmem_gk20a.c
cvs rdiff -u -r1.9 -r1.10 \
    src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/instmem/nouveau_nvkm_subdev_instmem_gk20a.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/instmem/nouveau_nvkm_subdev_instmem_gk20a.c:1.8 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/instmem/nouveau_nvkm_subdev_instmem_gk20a.c:1.9
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/instmem/nouveau_nvkm_subdev_instmem_gk20a.c:1.8	Sun Dec 19 11:34:45 2021
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/instmem/nouveau_nvkm_subdev_instmem_gk20a.c	Sun Dec 19 12:29:47 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: nouveau_nvkm_subdev_instmem_gk20a.c,v 1.8 2021/12/19 11:34:45 riastradh Exp $	*/
+/*	$NetBSD: nouveau_nvkm_subdev_instmem_gk20a.c,v 1.9 2021/12/19 12:29:47 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
@@ -44,7 +44,7 @@
  * goes beyond a certain threshold. At the moment this limit is 1MB.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_subdev_instmem_gk20a.c,v 1.8 2021/12/19 11:34:45 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_subdev_instmem_gk20a.c,v 1.9 2021/12/19 12:29:47 riastradh Exp $");
 
 #include "priv.h"
 
@@ -507,24 +507,25 @@ gk20a_instobj_ctor_iommu(struct gk20a_in
 	node->base.memory.ptrs = &gk20a_instobj_ptrs;
 
 #ifdef __NetBSD__
+	bus_size_t nbytes = (bus_size_t)npages << PAGE_SHIFT;
 	__USE(i);
 	__USE(r);
 	__USE(dev);
 	/* XXX errno NetBSD->Linux */
-	ret = -bus_dmamem_alloc(imem->dmat, npages << PAGE_SHIFT, PAGE_SIZE,
+	ret = -bus_dmamem_alloc(imem->dmat, nbytes, PAGE_SIZE,
 	    PAGE_SIZE, node->segs, npages, &node->nsegs, BUS_DMA_WAITOK);
 	if (ret)
 fail0:		goto out;
 	/* XXX errno NetBSD->Linux */
-	ret = -bus_dmamap_create(imem->dmat, npages << PAGE_SHIFT, 1,
-	    npages << PAGE_SHIFT, PAGE_SIZE, BUS_DMA_WAITOK, &node->map);
+	ret = -bus_dmamap_create(imem->dmat, nbytes, 1, nbytes, PAGE_SIZE,
+	    BUS_DMA_WAITOK, &node->map);
 	if (ret) {
 fail1:		bus_dmamem_free(imem->dmat, node->segs, node->nsegs);
 		goto fail0;
 	}
 	/* XXX errno NetBSD->Linux */
 	ret = -bus_dmamap_load_raw(imem->dmat, node->map, node->segs,
-	    node->nsegs, npages << PAGE_SHIFT, BUS_DMA_WAITOK);
+	    node->nsegs, nbytes, BUS_DMA_WAITOK);
 	if (ret) {
 fail2: __unused
 		bus_dmamap_destroy(imem->dmat, node->map);

Index: src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c
diff -u src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c:1.9 src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c:1.10
--- src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c:1.9	Sat Dec 18 23:45:44 2021
+++ src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c	Sun Dec 19 12:29:47 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: via_dmablit.c,v 1.9 2021/12/18 23:45:44 riastradh Exp $	*/
+/*	$NetBSD: via_dmablit.c,v 1.10 2021/12/19 12:29:47 riastradh Exp $	*/
 
 /* via_dmablit.c -- PCI DMA BitBlt support for the VIA Unichrome/Pro
  *
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: via_dmablit.c,v 1.9 2021/12/18 23:45:44 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: via_dmablit.c,v 1.10 2021/12/19 12:29:47 riastradh Exp $");
 
 #include <linux/pagemap.h>
 #include <linux/pci.h>
@@ -212,7 +212,7 @@ via_free_sg_info(struct drm_device *dev,
 		bus_dmamap_unload(dev->dmat, vsg->desc_dmamap);
 		bus_dmamap_destroy(dev->dmat, vsg->desc_dmamap);
 		bus_dmamem_unmap(dev->dmat, vsg->desc_kva,
-		    vsg->num_desc_pages << PAGE_SHIFT);
+		    (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT);
 		bus_dmamem_free(dev->dmat, vsg->desc_segs, vsg->num_desc_segs);
 		kfree(vsg->desc_segs);
 #else
@@ -360,7 +360,8 @@ via_alloc_desc_pages(struct drm_device *
 		return -ENOMEM;
 	}
 	/* XXX errno NetBSD->Linux */
-	ret = -bus_dmamem_alloc(dev->dmat, vsg->num_desc_pages << PAGE_SHIFT,
+	ret = -bus_dmamem_alloc(dev->dmat,
+	    (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT,
 	    PAGE_SIZE, 0, vsg->desc_segs, vsg->num_pages, &vsg->num_desc_segs,
 	    BUS_DMA_WAITOK);
 	if (ret) {
@@ -371,7 +372,8 @@ via_alloc_desc_pages(struct drm_device *
 	/* XXX No nice way to scatter/gather map bus_dmamem.  */
 	/* XXX errno NetBSD->Linux */
 	ret = -bus_dmamem_map(dev->dmat, vsg->desc_segs, vsg->num_desc_segs,
-	    vsg->num_desc_pages << PAGE_SHIFT, &vsg->desc_kva, BUS_DMA_WAITOK);
+	    (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT, &vsg->desc_kva,
+	    BUS_DMA_WAITOK);
 	if (ret) {
 		bus_dmamem_free(dev->dmat, vsg->desc_segs, vsg->num_desc_segs);
 		kfree(vsg->desc_segs);
@@ -379,23 +381,25 @@ via_alloc_desc_pages(struct drm_device *
 		return -ENOMEM;
 	}
 	/* XXX errno NetBSD->Linux */
-	ret = -bus_dmamap_create(dev->dmat, vsg->num_desc_pages << PAGE_SHIFT,
+	ret = -bus_dmamap_create(dev->dmat,
+	    (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT,
 	    vsg->num_desc_pages, PAGE_SIZE, 0, BUS_DMA_WAITOK,
 	    &vsg->desc_dmamap);
 	if (ret) {
 		bus_dmamem_unmap(dev->dmat, vsg->desc_kva,
-		    vsg->num_desc_pages << PAGE_SHIFT);
+		    (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT);
 		bus_dmamem_free(dev->dmat, vsg->desc_segs, vsg->num_desc_segs);
 		kfree(vsg->desc_segs);
 		kfree(vsg->desc_pages);
 		return -ENOMEM;
 	}
 	ret = -bus_dmamap_load(dev->dmat, vsg->desc_dmamap, vsg->desc_kva,
-	    vsg->num_desc_pages << PAGE_SHIFT, NULL, BUS_DMA_WAITOK);
+	    (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT, NULL,
+	    BUS_DMA_WAITOK);
 	if (ret) {
 		bus_dmamap_destroy(dev->dmat, vsg->desc_dmamap);
 		bus_dmamem_unmap(dev->dmat, vsg->desc_kva,
-		    vsg->num_desc_pages << PAGE_SHIFT);
+		    (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT);
 		bus_dmamem_free(dev->dmat, vsg->desc_segs, vsg->num_desc_segs);
 		kfree(vsg->desc_segs);
 		kfree(vsg->desc_pages);

Reply via email to