diff --git a/drivers/video/msm/mdp_debugfs.c b/drivers/video/msm/mdp_debugfs.c index d3e0c8ddd63e33072bcfe118fb99f7e537f50c2c..82acfa1f231dcc40f765ec4a10bb18bc50c31c73 100644 --- a/drivers/video/msm/mdp_debugfs.c +++ b/drivers/video/msm/mdp_debugfs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. +/* Copyright (c) 2009-2012, 2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -39,6 +39,9 @@ #endif #define MDP_DEBUG_BUF 2048 +#define MDP_MAX_OFFSET 0xF05FC +#define MDDI_MAX_OFFSET 0xC +#define HDMI_MAX_OFFSET 0x59C static uint32 mdp_offset; static uint32 mdp_count; @@ -78,11 +81,18 @@ static ssize_t mdp_offset_write( debug_buf[count] = 0; /* end of string */ - sscanf(debug_buf, "%x %d", &off, &cnt); + if (sscanf(debug_buf, "%x %d", &off, &cnt) != 2) + return -EFAULT; if (cnt <= 0) cnt = 1; + if ((off > MDP_MAX_OFFSET) || (cnt > (MDP_MAX_OFFSET - off))) { + printk(KERN_INFO "%s: Invalid offset%x+cnt%d > %x\n", __func__, + off, cnt, MDP_MAX_OFFSET); + return -EFAULT; + } + mdp_offset = off; mdp_count = cnt; @@ -154,6 +164,14 @@ static ssize_t mdp_reg_write( debug_buf[count] = 0; /* end of string */ cnt = sscanf(debug_buf, "%x %x", &off, &data); + if (cnt != 2) + return -EFAULT; + + if (off > MDP_MAX_OFFSET) { + printk(KERN_INFO "%s: Invalid offset%x > %x\n", __func__, + off, MDP_MAX_OFFSET); + return -EFAULT; + } mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE); outpdw(MDP_BASE + off, data); @@ -620,6 +638,17 @@ static void mddi_reg_write(int ndx, uint32 off, uint32 data) else base = (char *)msm_pmdh_base; + if (base == NULL) { + printk(KERN_INFO "%s: base offset is not set properly. \ + Please check if MDDI is enabled correctly\n", __func__); + return; + } + + if (off > MDDI_MAX_OFFSET) { + printk(KERN_INFO "%s: Invalid offset=%x > %x\n", __func__, + off, MDDI_MAX_OFFSET); + return; + } mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE); writel(data, base + off); mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE); @@ -682,6 +711,14 @@ static ssize_t pmdh_reg_write( debug_buf[count] = 0; /* end of string */ cnt = sscanf(debug_buf, "%x %x", &off, &data); + if (cnt != 2) + return -EFAULT; + + if (off > MDDI_MAX_OFFSET) { + printk(KERN_INFO "%s: Invalid offset=%x > %x\n", __func__, + off, MDDI_MAX_OFFSET); + return -EFAULT; + } mddi_reg_write(0, off, data); @@ -737,6 +774,14 @@ static ssize_t emdh_reg_write( debug_buf[count] = 0; /* end of string */ cnt = sscanf(debug_buf, "%x %x", &off, &data); + if (cnt != 2) + return -EFAULT; + + if (off > MDDI_MAX_OFFSET) { + printk(KERN_INFO "%s: Invalid offset=%x > %x\n", __func__, + off, MDDI_MAX_OFFSET); + return -EFAULT; + } mddi_reg_write(1, off, data); @@ -884,15 +929,18 @@ static ssize_t dbg_offset_write( cnt = sscanf(debug_buf, "%x %d %x", &off, &num, &base); - if (cnt < 0) - cnt = 0; + if (cnt != 3) + return -EFAULT; + + if ((off > MDP_MAX_OFFSET) || (num > (MDP_MAX_OFFSET - off))) { + printk(KERN_INFO "%s: Invalid offset%x+num%d > %x\n", __func__, + off, num, MDP_MAX_OFFSET); + return -EFAULT; + } - if (cnt >= 1) - dbg_offset = off; - if (cnt >= 2) - dbg_count = num; - if (cnt >= 3) - dbg_base = (char *)base; + dbg_offset = off; + dbg_count = num; + dbg_base = (char *)base; printk(KERN_INFO "%s: offset=%x cnt=%d base=%x\n", __func__, dbg_offset, dbg_count, (int)dbg_base); @@ -951,6 +999,14 @@ static ssize_t dbg_reg_write( debug_buf[count] = 0; /* end of string */ cnt = sscanf(debug_buf, "%x %x", &off, &data); + if (cnt != 2) + return -EFAULT; + + if (off > MDP_MAX_OFFSET) { + printk(KERN_INFO "%s: Invalid offset%x > %x\n", __func__, + off, MDP_MAX_OFFSET); + return -EFAULT; + } writel(data, dbg_base + off); @@ -1073,6 +1129,8 @@ static ssize_t dbg_force_ov0_blt_write( debug_buf[count] = 0; /* end of string */ cnt = sscanf(debug_buf, "%x", &dbg_force_ov0_blt); + if (cnt != 1) + return -EFAULT; pr_info("%s: dbg_force_ov0_blt = %x\n", __func__, dbg_force_ov0_blt); @@ -1136,6 +1194,8 @@ static ssize_t dbg_force_ov1_blt_write( debug_buf[count] = 0; /* end of string */ cnt = sscanf(debug_buf, "%x", &dbg_force_ov1_blt); + if (cnt != 1) + return -EFAULT; pr_info("%s: dbg_force_ov1_blt = %x\n", __func__, dbg_force_ov1_blt); @@ -1191,14 +1251,17 @@ static ssize_t hdmi_offset_write( debug_buf[count] = 0; /* end of string */ cnt = sscanf(debug_buf, "%x %d", &off, &num); + if (cnt != 2) + return -EFAULT; - if (cnt < 0) - cnt = 0; + if ((off > HDMI_MAX_OFFSET) || (num > (HDMI_MAX_OFFSET - off))) { + printk(KERN_INFO "%s: Invalid offset%x+num%d > %x\n", __func__, + off, num, HDMI_MAX_OFFSET); + return -EFAULT; + } - if (cnt >= 1) - hdmi_offset = off; - if (cnt >= 2) - hdmi_count = num; + hdmi_offset = off; + hdmi_count = num; printk(KERN_INFO "%s: offset=%x cnt=%d\n", __func__, hdmi_offset, hdmi_count); @@ -1262,6 +1325,15 @@ static ssize_t hdmi_reg_write( cnt = sscanf(debug_buf, "%x %x", &off, &data); + if (cnt != 2) + return -EFAULT; + + if (off > HDMI_MAX_OFFSET) { + printk(KERN_INFO "%s: Invalid offset%x > %x\n", __func__, + off, HDMI_MAX_OFFSET); + return -EFAULT; + } + writel(data, base + off); printk(KERN_INFO "%s: addr=%x data=%x\n", @@ -1355,14 +1427,14 @@ int mdp_debugfs_init(void) return -1; } - if (debugfs_create_file("off", 0644, dent, 0, &mdp_off_fops) + if (debugfs_create_file("off", 0600, dent, 0, &mdp_off_fops) == NULL) { printk(KERN_ERR "%s(%d): debugfs_create_file: index fail\n", __FILE__, __LINE__); return -1; } - if (debugfs_create_file("reg", 0644, dent, 0, &mdp_reg_fops) + if (debugfs_create_file("reg", 0600, dent, 0, &mdp_reg_fops) == NULL) { printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n", __FILE__, __LINE__); @@ -1402,7 +1474,7 @@ int mdp_debugfs_init(void) return -1; } - if (debugfs_create_file("reg", 0644, dent, 0, &pmdh_fops) + if (debugfs_create_file("reg", 0600, dent, 0, &pmdh_fops) == NULL) { printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n", __FILE__, __LINE__); @@ -1417,7 +1489,7 @@ int mdp_debugfs_init(void) return -1; } - if (debugfs_create_file("reg", 0644, dent, 0, &emdh_fops) + if (debugfs_create_file("reg", 0600, dent, 0, &emdh_fops) == NULL) { printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n", __FILE__, __LINE__); @@ -1432,21 +1504,21 @@ int mdp_debugfs_init(void) return -1; } - if (debugfs_create_file("base", 0644, dent, 0, &dbg_base_fops) + if (debugfs_create_file("base", 0600, dent, 0, &dbg_base_fops) == NULL) { printk(KERN_ERR "%s(%d): debugfs_create_file: index fail\n", __FILE__, __LINE__); return -1; } - if (debugfs_create_file("off", 0644, dent, 0, &dbg_off_fops) + if (debugfs_create_file("off", 0600, dent, 0, &dbg_off_fops) == NULL) { printk(KERN_ERR "%s(%d): debugfs_create_file: index fail\n", __FILE__, __LINE__); return -1; } - if (debugfs_create_file("reg", 0644, dent, 0, &dbg_reg_fops) + if (debugfs_create_file("reg", 0600, dent, 0, &dbg_reg_fops) == NULL) { printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n", __FILE__, __LINE__); @@ -1462,14 +1534,14 @@ int mdp_debugfs_init(void) return PTR_ERR(dent); } - if (debugfs_create_file("off", 0644, dent, 0, &hdmi_off_fops) + if (debugfs_create_file("off", 0600, dent, 0, &hdmi_off_fops) == NULL) { printk(KERN_ERR "%s(%d): debugfs_create_file: 'off' fail\n", __FILE__, __LINE__); return -ENOENT; } - if (debugfs_create_file("reg", 0644, dent, 0, &hdmi_reg_fops) + if (debugfs_create_file("reg", 0600, dent, 0, &hdmi_reg_fops) == NULL) { printk(KERN_ERR "%s(%d): debugfs_create_file: 'reg' fail\n", __FILE__, __LINE__);