Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6d26ad6 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "disp: msm: dp: validate edid before dereferencing"

parents 626c08ec c04ee7fd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -165,7 +165,7 @@ static ssize_t dp_debug_write_edid(struct file *file,
	kfree(buf);

	if (!debug->dp_debug.sim_mode)
		debug->panel->set_edid(debug->panel, edid);
		debug->panel->set_edid(debug->panel, edid, debug->edid_size);

	mutex_unlock(&debug->lock);
	return rc;
+19 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#include "msm_kms.h"
#include "dp_panel.h"
#include <drm/drm_edid.h>

#define DP_PANEL_DEFAULT_BPP 24
#define DP_MAX_DS_PORT_COUNT 1
@@ -235,8 +236,24 @@ static int dp_panel_set_default_link_params(struct dp_panel *dp_panel)

	return 0;
}
static int dp_panel_validate_edid(struct edid *edid, size_t edid_size)
{
	if (!edid || (edid_size < EDID_LENGTH))
		return false;

	if (EDID_LENGTH * (edid->extensions + 1) > edid_size) {
		pr_err("edid size does not match allocated.\n");
		return false;
	}
	if (!drm_edid_is_valid(edid)) {
		pr_err("invalid edid.\n");
		return false;
	}
	return true;
}

static int dp_panel_set_edid(struct dp_panel *dp_panel, u8 *edid)
static int dp_panel_set_edid(struct dp_panel *dp_panel, u8 *edid,
		size_t edid_size)
{
	struct dp_panel_private *panel;

@@ -247,7 +264,7 @@ static int dp_panel_set_edid(struct dp_panel *dp_panel, u8 *edid)

	panel = container_of(dp_panel, struct dp_panel_private, dp_panel);

	if (edid) {
	if (edid && dp_panel_validate_edid((struct edid *)edid, edid_size)) {
		dp_panel->edid_ctrl->edid = (struct edid *)edid;
		panel->custom_edid = true;
	} else {
+1 −1
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ struct dp_panel {
	int (*get_modes)(struct dp_panel *dp_panel,
		struct drm_connector *connector, struct dp_display_mode *mode);
	void (*handle_sink_request)(struct dp_panel *dp_panel);
	int (*set_edid)(struct dp_panel *dp_panel, u8 *edid);
	int (*set_edid)(struct dp_panel *dp_panel, u8 *edid, size_t edid_size);
	int (*set_dpcd)(struct dp_panel *dp_panel, u8 *dpcd);
	int (*setup_hdr)(struct dp_panel *dp_panel,
		struct drm_msm_ext_hdr_metadata *hdr_meta);