[PATCH 13/17] DRM/KMS/EDID: Allow for multiple Connectors when specifying 'firmware'-EDID Files.

Takashi Iwai tiwai at suse.de
Tue Nov 20 00:38:47 PST 2012


At Mon, 19 Nov 2012 15:23:14 -0500,
"Egbert Eich " <"eich at novell.com> wrote:
> 
> So far it was only possible to load an EDID for a single connector (unless
> no connector was specified at all in which case the same EDID file was used
> for all).
> This patch extends the EDID loader so that EDID files can be specified for
> more than one connector. A semicolon is used to separate the different connector
> sections.
> The option now looks like this:
>    edid_firmware="[<connector_0>:]<edid_file_0>[;<connector_n>:<edid_file_1>]..."
> 
> Signed-off-by: Egbert Eich <eich at suse.de>
> ---
>  drivers/gpu/drm/drm_edid_load.c |   45 ++++++++++++++++++++++++++------------
>  1 files changed, 31 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_edid_load.c b/drivers/gpu/drm/drm_edid_load.c
> index 1475c6f..a40a88505 100644
> --- a/drivers/gpu/drm/drm_edid_load.c
> +++ b/drivers/gpu/drm/drm_edid_load.c
> @@ -196,26 +196,43 @@ struct edid *
>  drm_load_edid_firmware(struct drm_connector *connector)
>  {
>  	char *connector_name = drm_get_connector_name(connector);
> -	char *edidname = edid_firmware, *last, *colon;
> -	struct edid *edid;
> +	char *edidname, *last, *colon;
> +	struct edid *edid = NULL;
> +	char *next, *mem;
> +	bool many = false;
>  
> -	if (*edidname == '\0')
> +	if (*edid_firmware == '\0')
>  		return NULL;
>  
> -	colon = strchr(edidname, ':');
> -	if (colon != NULL) {
> -		if (strncmp(connector_name, edidname, colon - edidname))
> -			return NULL;
> -		edidname = colon + 1;
> -		if (*edidname == '\0')
> -			return NULL;
> +	edidname = mem = kstrndup(edid_firmware, PATH_MAX, GFP_KERNEL);
> +	do {

Missing NULL check of edidname.


Takashi

> +		next = strchr(edidname, ';');
> +		if (next)
> +			*(next++) = '\0';
> +		colon = strchr(edidname, ':');
> +		if (colon == NULL) {
> +			if (next || many)
> +				edidname = NULL;
> +			break;
> +		} else if (!strncmp(connector_name, edidname, colon - edidname)) {
> +			edidname = colon + 1;
> +			break;
> +		}
> +		edidname = next;
> +		many = true;
> +	} while (edidname);
> +
> +	if (edidname && *edidname != '\0') {
> +		last = edidname + strlen(edidname) - 1;
> +		if (*last == '\n')
> +			*last = '\0';
> +
> +		if (strlen(edidname) > 0)
> +			edid = edid_load(connector, edidname, connector_name);
>  	}
>  
> -	last = edidname + strlen(edidname) - 1;
> -	if (*last == '\n')
> -		*last = '\0';
> +	kfree(mem);
>  
> -	edid = edid_load(connector, edidname, connector_name);
>  	if (IS_ERR_OR_NULL(edid))
>  		return NULL;
>  
> -- 
> 1.7.7
> 


More information about the dri-devel mailing list