⬢ DragonFlyBSD Kernel Audit
DF-5035 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/amd/display/dc/i2caux/dce110/i2caux_dce110.c	2026-09-26 06:51:12.857551787 +0000
+++ b/sys/dev/drm/amd/display/dc/i2caux/dce110/i2caux_dce110.c	2026-09-26 06:51:39.625202877 +0000
@@ -102,11 +102,14 @@
 	if (!engine)
 		return NULL;
 
+	lockmgr(&i2caux_dce110->hw_buffer_lock, LK_EXCLUSIVE);
 	if (!i2caux_dce110->i2c_hw_buffer_in_use &&
-		engine->base.funcs->acquire(&engine->base, ddc)) {
+			engine->base.funcs->acquire(&engine->base, ddc)) {
 		i2caux_dce110->i2c_hw_buffer_in_use = true;
+		lockmgr(&i2caux_dce110->hw_buffer_lock, LK_RELEASE);
 		return engine;
 	}
+	lockmgr(&i2caux_dce110->hw_buffer_lock, LK_RELEASE);
 
 	return NULL;
 }
@@ -118,8 +121,11 @@
 	struct i2caux_dce110 *i2caux_dce110 = FROM_I2C_AUX(i2caux);
 
 	if (engine->funcs->get_engine_type(engine) ==
-		I2CAUX_ENGINE_TYPE_I2C_DDC_HW)
+			I2CAUX_ENGINE_TYPE_I2C_DDC_HW) {
+		lockmgr(&i2caux_dce110->hw_buffer_lock, LK_EXCLUSIVE);
 		i2caux_dce110->i2c_hw_buffer_in_use = false;
+		lockmgr(&i2caux_dce110->hw_buffer_lock, LK_RELEASE);
+	}
 
 	dal_i2caux_release_engine(i2caux, engine);
 }