summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Vanderlip <carlv@codeaurora.org>2013-10-23 18:36:01 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:23:40 -0700
commitba68b06806c32965dc4eb2bac0eca55d36388243 (patch)
tree640407f49d86170bb6142ebf13e6dcb6ee54678e
parente7be929aba5fb2bff7928f2805bdcccd2b0915fd (diff)
msm: mdss: Sanitize post processing inputs
Sanitize the inputs to histogram, assertive display, and calibration buffer so that invalid values cannot be used as feature configuration. CRs-Fixed: 516710 Change-Id: Ifb585174b1baadbac628f53fe67f3c3b3ae61a54 Signed-off-by: Carl Vanderlip <carlv@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_hwio.h2
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_pp.c29
2 files changed, 29 insertions, 2 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_hwio.h b/drivers/video/fbdev/msm/mdss_mdp_hwio.h
index 302ad57c80d7..9c36c74cdc51 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_hwio.h
+++ b/drivers/video/fbdev/msm/mdss_mdp_hwio.h
@@ -379,6 +379,8 @@ enum mdss_mdp_writeback_index {
#define MDSS_MDP_REG_WB_CSC_BASE 0x260
#define MDSS_MDP_REG_WB_DST_ADDR_SW_STATUS 0x2B0
+#define MDSS_MDP_MAX_AD_AL 65535
+#define MDSS_MDP_MAX_AD_STR 255
#define MDSS_MDP_REG_AD_BYPASS 0x000
#define MDSS_MDP_REG_AD_CTRL_0 0x004
diff --git a/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c
index b35bc692589a..522f307d9055 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_pp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c
@@ -2857,6 +2857,7 @@ exit:
return ret;
}
+#define MDSS_MAX_HIST_BIN_SIZE 16777215
int mdss_mdp_hist_start(struct mdp_histogram_start_req *req)
{
u32 done_shift_bit;
@@ -2865,9 +2866,13 @@ int mdss_mdp_hist_start(struct mdp_histogram_start_req *req)
int i, ret = 0;
u32 disp_num, dspp_num = 0;
u32 mixer_cnt, mixer_id[MDSS_MDP_INTF_MAX_LAYERMIXER];
+ u32 frame_size;
struct mdss_mdp_pipe *pipe;
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
+ if (!mdss_is_ready())
+ return -EPROBE_DEFER;
+
if ((PP_BLOCK(req->block) < MDP_LOGICAL_BLOCK_DISP_0) ||
(PP_BLOCK(req->block) >= MDP_BLOCK_MAX))
return -EINVAL;
@@ -2887,6 +2892,16 @@ int mdss_mdp_hist_start(struct mdp_histogram_start_req *req)
ret = -EPERM;
goto hist_exit;
}
+
+ frame_size = (mdata->ctl_off[mixer_id[0]].width *
+ mdata->ctl_off[mixer_id[0]].height);
+ if (!frame_size ||
+ ((MDSS_MAX_HIST_BIN_SIZE / frame_size) < req->frame_cnt)) {
+ pr_err("%s, too many frames for given display size, %d",
+ __func__, req->frame_cnt);
+ ret = -EINVAL;
+ goto hist_exit;
+ }
mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);
if (PP_LOCAT(req->block) == MDSS_PP_SSPP_CFG) {
@@ -3698,6 +3713,11 @@ int mdss_mdp_ad_input(struct msm_fb_data_type *mfd,
ret = -EINVAL;
goto error;
}
+ if (input->in.amb_light > MDSS_MDP_MAX_AD_AL) {
+ pr_warn("invalid input ambient light");
+ ret = -EINVAL;
+ goto error;
+ }
ad->ad_data_mode = MDSS_AD_INPUT_AMBIENT;
pr_debug("ambient = %d", input->in.amb_light);
ad->ad_data = input->in.amb_light;
@@ -3712,6 +3732,11 @@ int mdss_mdp_ad_input(struct msm_fb_data_type *mfd,
ret = -EINVAL;
goto error;
}
+ if (input->in.strength > MDSS_MDP_MAX_AD_STR) {
+ pr_warn("invalid input strength");
+ ret = -EINVAL;
+ goto error;
+ }
ad->ad_data_mode = MDSS_AD_INPUT_STRENGTH;
pr_debug("strength = %d", input->in.strength);
ad->ad_data = input->in.strength;
@@ -4591,8 +4616,8 @@ int mdss_mdp_calib_config_buffer(struct mdp_calib_config_buffer *cfg,
return ret;
}
- if (cfg->size == 0) {
- pr_err("Invalid buffer size\n");
+ if (cfg->size == 0 || cfg->size > PAGE_SIZE) {
+ pr_err("Invalid buffer size %d\n", cfg->size);
return ret;
}