Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 12:33:42 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/linux: linux_dma_resv.c

Log Message:
drm: Paranoia: handle fencep=null, fence!=null, and 0 shared.

Not sure this is possible but I don't know the API well enough to
prove it can't happen.


To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 src/sys/external/bsd/drm2/linux/linux_dma_resv.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/linux/linux_dma_resv.c
diff -u src/sys/external/bsd/drm2/linux/linux_dma_resv.c:1.19 src/sys/external/bsd/drm2/linux/linux_dma_resv.c:1.20
--- src/sys/external/bsd/drm2/linux/linux_dma_resv.c:1.19	Sun Dec 19 12:33:34 2021
+++ src/sys/external/bsd/drm2/linux/linux_dma_resv.c	Sun Dec 19 12:33:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_dma_resv.c,v 1.19 2021/12/19 12:33:34 riastradh Exp $	*/
+/*	$NetBSD: linux_dma_resv.c,v 1.20 2021/12/19 12:33:42 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_dma_resv.c,v 1.19 2021/12/19 12:33:34 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_dma_resv.c,v 1.20 2021/12/19 12:33:42 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/poll.h>
@@ -758,7 +758,7 @@ dma_resv_get_fences_rcu(const struct dma
 	const struct dma_resv_list *list = NULL;
 	struct dma_fence *fence = NULL;
 	struct dma_fence **shared = NULL;
-	unsigned shared_alloc, shared_count, i;
+	unsigned shared_alloc = 0, shared_count, i;
 	struct dma_resv_read_ticket ticket;
 
 top:	KASSERT(fence == NULL);
@@ -851,11 +851,19 @@ top:	KASSERT(fence == NULL);
 
 	/* Success!  */
 	rcu_read_unlock();
+	KASSERT(shared_count <= shared_alloc);
+	KASSERT(shared_alloc == 0 || shared_count < shared_alloc);
+	KASSERT(shared_alloc <= UINT_MAX);
 	if (fencep) {
 		*fencep = fence;
 	} else if (fence) {
-		KASSERT(shared_count < UINT_MAX);
-		shared[shared_count++] = fence;
+		if (shared_count) {
+			shared[shared_count++] = fence;
+		} else {
+			shared = kmalloc(sizeof(shared[0]), GFP_KERNEL);
+			shared[0] = fence;
+			shared_count = 1;
+		}
 	}
 	*nsharedp = shared_count;
 	*sharedp = shared;

Reply via email to