⬢ DragonFlyBSD Kernel Audit
DF-4033 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/radeon_connectors.c
+++ b/sys/dev/drm/radeon/radeon_connectors.c
@@ -159,8 +159,15 @@
 			const struct drm_connector_helper_funcs *connector_funcs =
 				connector->helper_private;
 			struct drm_encoder *encoder = connector_funcs->best_encoder(connector);
-			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
-			struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
+			struct radeon_encoder *radeon_encoder;
+			struct radeon_encoder_atom_dig *dig;
+
+			if (!encoder)
+				break;
+			radeon_encoder = to_radeon_encoder(encoder);
+			dig = radeon_encoder->enc_priv;
+			if (!dig)
+				break;
 
 			if (dig->lcd_misc & ATOM_PANEL_MISC_V13_6BIT_PER_COLOR)
 				bpc = 6;
@@ -722,6 +729,8 @@
 			const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
 			radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
 		}
+		if (!radeon_encoder)
+			return 0;
 
 		switch (val) {
 		default:
@@ -749,6 +758,8 @@
 			const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
 			radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
 		}
+		if (!radeon_encoder)
+			return 0;
 
 		if (radeon_encoder->output_csc == val)
 			return 0;
@@ -961,6 +972,8 @@
 		const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
 		radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
 	}
+	if (!radeon_encoder)
+		return 0;
 
 	switch (value) {
 	case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;