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);