⬢ DragonFlyBSD Kernel Audit
DF-4713 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/amd/amdgpu/amdgpu_irq.c
+++ b/sys/dev/drm/amd/amdgpu/amdgpu_irq.c
@@ -433,6 +433,13 @@
 			return;
 		}
 
+		if (!src->funcs->process) {
+			/* NB: optional callback - e.g. dce_virtual crtc_irq */
+			DRM_DEBUG("Unprocessed interrupt src_id: %d\n",
+				  src_id);
+			return;
+		}
+
 		r = src->funcs->process(adev, src, entry);
 		if (r)
 			DRM_ERROR("error processing interrupt (%d)\n", r);
@@ -464,6 +471,13 @@
 	else
 		state = AMDGPU_IRQ_STATE_DISABLE;
 
+	/* NB: optional callback - not every registered source has a
+	 * .set (cf. amdgpu_irq_get/put/amdgpu_irq_disable_all) */
+	if (!src->funcs->set) {
+		spin_unlock_irqrestore(&adev->irq.lock, irqflags);
+		return -EINVAL;
+	}
+
 	r = src->funcs->set(adev, src, type, state);
 	spin_unlock_irqrestore(&adev->irq.lock, irqflags);
 	return r;