⬢ DragonFlyBSD Kernel Audit
DF-3957 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/drm/radeon/atombios_encoders.c b/sys/dev/drm/radeon/atombios_encoders.c
index 1111111..2222222 100644
--- a/sys/dev/drm/radeon/atombios_encoders.c
+++ b/sys/dev/drm/radeon/atombios_encoders.c
@@ -739,7 +739,7 @@ int atombios_get_encoder_mode(struct drm_encoder *encoder)
 	struct radeon_connector_atom_dig *dig_connector;
 	struct radeon_encoder_atom_dig *dig_enc;
 
-	if (radeon_encoder_is_digital(encoder)) {
+	if (radeon_encoder_is_digital(encoder) && radeon_encoder->enc_priv) {
 		dig_enc = radeon_encoder->enc_priv;
 		if (dig_enc->active_mst_links)
 			return ATOM_ENCODER_MODE_DP_MST;
@@ -1082,6 +1082,9 @@ atombios_dig_transmitter_setup2(struct drm_encoder *encoder, int action, uint8_t
 	int dig_encoder = dig->dig_encoder;
 	int hpd_id = RADEON_HPD_NONE;
 
+	if (!dig)
+		return;
+
 	if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 		connector = radeon_get_connector_for_encoder_init(encoder);
@@ -1690,6 +1693,9 @@ radeon_atom_encoder_dpms_avivo(struct drm_encoder *encoder, int mode)
 		if (rdev->mode_info.bl_encoder) {
 			struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
 
+			if (!dig)
+				break;
 			atombios_set_backlight_level(radeon_encoder, dig->backlight_level);
 		} else {
 			args.ucAction = ATOM_LCD_BLON;
@@ -1721,6 +1727,9 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode)
 	struct radeon_connector_atom_dig *radeon_dig_connector = NULL;
 	bool travis_quirk = false;
 
+	if (!dig)
+		return;
+
 	if (connector) {
 		radeon_connector = to_radeon_connector(connector);
 		radeon_dig_connector = radeon_connector->con_priv;
@@ -2003,6 +2012,9 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder)
 			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
 				dig = radeon_encoder->enc_priv;
+				if (!dig)
+					break;
 				switch (dig->dig_encoder) {
 				case 0:
 					args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
@@ -2267,6 +2279,9 @@ int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder, int fe_idx)
 		radeon_test_encoder = to_radeon_encoder(test_encoder);
 		dig = radeon_test_encoder->enc_priv;
 
+		if (!dig)
+			continue;
+
 		if (dig->dig_encoder >= 0)
 			dig_enc_in_use |= (1 << dig->dig_encoder);
 	}
@@ -2658,6 +2673,10 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
 		if (atombios_get_encoder_mode(encoder) != ATOM_ENCODER_MODE_DP_MST) {
 			dig = radeon_encoder->enc_priv;
+			if (!dig) {
+				radeon_encoder->active_device = 0;
+				goto disable_done_active;
+			}
 			radeon_atom_release_dig_encoder(rdev, dig->dig_encoder);
 			dig->dig_encoder = -1;
 			radeon_encoder->active_device = 0;
+disable_done_active:
 		}
 	} else
 		radeon_encoder->active_device = 0;
# NOTE: matches the NULL guards the file already applies at :100
# (atombios_set_backlight_level), :240 (radeon_atom_backlight_init),
# :629 (atombios_digital_setup) and :2551 (radeon_atom_encoder_prepare).