⬢ DragonFlyBSD Kernel Audit
DF-4201 / fix.diff
← back to finding ↓ download raw
--- sys/dev/drm/amd/amdgpu/amdgpu_connectors.c
+++ amdgpu_connectors.fixed.c
@@ -136,10 +136,17 @@
 		else {
 			const struct drm_connector_helper_funcs *connector_funcs =
 				connector->helper_private;
 			struct drm_encoder *encoder = connector_funcs->best_encoder(connector);
-			struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
-			struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
+			struct amdgpu_encoder *amdgpu_encoder;
+			struct amdgpu_encoder_atom_dig *dig;
+
+			if (!encoder)
+				break;
+			amdgpu_encoder = to_amdgpu_encoder(encoder);
+			dig = amdgpu_encoder->enc_priv;
+			if (!dig)
+				break;
 
 			if (dig->lcd_misc & ATOM_PANEL_MISC_V13_6BIT_PER_COLOR)
 				bpc = 6;
 			else if (dig->lcd_misc & ATOM_PANEL_MISC_V13_8BIT_PER_COLOR)
@@ -580,9 +587,13 @@
 		if (connector->encoder) {
 			amdgpu_encoder = to_amdgpu_encoder(connector->encoder);
 		} else {
 			const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
-			amdgpu_encoder = to_amdgpu_encoder(connector_funcs->best_encoder(connector));
+			struct drm_encoder *best = connector_funcs->best_encoder(connector);
+
+			if (!best)
+				return 0;
+			amdgpu_encoder = to_amdgpu_encoder(best);
 		}
 
 		switch (val) {
 		default:
@@ -789,9 +800,13 @@
 	if (connector->encoder)
 		amdgpu_encoder = to_amdgpu_encoder(connector->encoder);
 	else {
 		const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
-		amdgpu_encoder = to_amdgpu_encoder(connector_funcs->best_encoder(connector));
+		struct drm_encoder *best = connector_funcs->best_encoder(connector);
+
+		if (!best)
+			return 0;
+		amdgpu_encoder = to_amdgpu_encoder(best);
 	}
 
 	switch (value) {
 	case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;