diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_acpi.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_acpi.c | 22 | 
1 files changed, 20 insertions, 2 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_acpi.c b/drivers/gpu/drm/i915/display/intel_acpi.c index e21fb14d5e07..833d0c1be4f1 100644 --- a/drivers/gpu/drm/i915/display/intel_acpi.c +++ b/drivers/gpu/drm/i915/display/intel_acpi.c @@ -84,13 +84,31 @@ static void intel_dsm_platform_mux_info(acpi_handle dhandle)  		return;  	} +	if (!pkg->package.count) { +		DRM_DEBUG_DRIVER("no connection in _DSM\n"); +		return; +	} +  	connector_count = &pkg->package.elements[0];  	DRM_DEBUG_DRIVER("MUX info connectors: %lld\n",  		  (unsigned long long)connector_count->integer.value);  	for (i = 1; i < pkg->package.count; i++) {  		union acpi_object *obj = &pkg->package.elements[i]; -		union acpi_object *connector_id = &obj->package.elements[0]; -		union acpi_object *info = &obj->package.elements[1]; +		union acpi_object *connector_id; +		union acpi_object *info; + +		if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < 2) { +			DRM_DEBUG_DRIVER("Invalid object for MUX #%d\n", i); +			continue; +		} + +		connector_id = &obj->package.elements[0]; +		info = &obj->package.elements[1]; +		if (info->type != ACPI_TYPE_BUFFER || info->buffer.length < 4) { +			DRM_DEBUG_DRIVER("Invalid info for MUX obj #%d\n", i); +			continue; +		} +  		DRM_DEBUG_DRIVER("Connector id: 0x%016llx\n",  			  (unsigned long long)connector_id->integer.value);  		DRM_DEBUG_DRIVER("  port id: %s\n", | 
