⬢ DragonFlyBSD Kernel Audit
DF-4103 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/amd/amdgpu/atombios_encoders.c
+++ b/sys/dev/drm/amd/amdgpu/atombios_encoders.c
@@ -645,6 +645,9 @@ amdgpu_atombios_encoder_setup_dig_encoder(struct drm_encoder *encoder,
 	int dp_clock = 0;
 	int dp_lane_count = 0;
 	int hpd_id = AMDGPU_HPD_NONE;
 
+	if (!dig)
+		return;
+
 	if (connector) {
 		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 		struct amdgpu_connector_atom_dig *dig_connector =
@@ -844,6 +847,10 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int ac
 	int hpd_id = AMDGPU_HPD_NONE;
 	int dig_encoder;
 
+	/* enc_priv may be NULL (get_lcd_info/get_dig_info failure) */
+	if (dig == NULL)
+		return;
+
 	if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 		connector = amdgpu_get_connector_for_encoder_init(encoder);
 		/* just needed to avoid bailing in the encoder check.  the encoder
@@ -1399,6 +1406,9 @@ amdgpu_atombios_encoder_setup_dig(struct drm_encoder *encoder, int action)
 	struct amdgpu_connector_atom_dig *amdgpu_dig_connector = NULL;
 
+	if (!dig)
+		return;
+
 	if (connector) {
 		amdgpu_connector = to_amdgpu_connector(connector);
 		amdgpu_dig_connector = amdgpu_connector->con_priv;
 	}
@@ -1614,6 +1624,8 @@ amdgpu_atombios_encoder_set_crtc_source(struct drm_encoder *encoder)
 			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
 				dig = amdgpu_encoder->enc_priv;
+				if (!dig)
+					break;
 				switch (dig->dig_encoder) {
 				case 0:
 					args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
@@ -1683,6 +1695,8 @@ amdgpu_atombios_encoder_set_crtc_source(struct drm_encoder *encoder)
 			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
 				dig = amdgpu_encoder->enc_priv;
+				if (!dig)
+					break;
 				switch (dig->dig_encoder) {
 				case 0:
 					args.v3.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;