Skip to content

Commit 686e8a2

Browse files
jwrdegoededtor
authored andcommitted
Input: goodix - add minimum firmware size check
Our goodix_check_cfg_* helpers do things like: int i, raw_cfg_len = cfg->size - 2; ... if (check_sum != cfg->data[raw_cfg_len]) { When cfg->size < 2, this will end up indexing the cfg->data array with a negative value, which will not end well. To fix this this commit adds a new GOODIX_CONFIG_MIN_LENGTH define and adds a minimum size check for firmware-config files using this new define. For consistency this commit also adds a new GOODIX_CONFIG_GT9X_LENGTH for the length used for recent gt9xx and gt1xxx chips, instead of using GOODIX_CONFIG_MAX_LENGTH for this, so that if other length defines get added in the future it will be clear that the MIN and MAX defines should contain the min and max values of all the other defines. Signed-off-by: Hans de Goede <[email protected]> Reviewed-by: Bastien Nocera <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Dmitry Torokhov <[email protected]>
1 parent de956ca commit 686e8a2

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

drivers/input/touchscreen/goodix.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@
3939
#define GOODIX_MAX_CONTACT_SIZE 9
4040
#define GOODIX_MAX_CONTACTS 10
4141

42-
#define GOODIX_CONFIG_MAX_LENGTH 240
42+
#define GOODIX_CONFIG_MIN_LENGTH 186
4343
#define GOODIX_CONFIG_911_LENGTH 186
4444
#define GOODIX_CONFIG_967_LENGTH 228
45+
#define GOODIX_CONFIG_GT9X_LENGTH 240
46+
#define GOODIX_CONFIG_MAX_LENGTH 240
4547

4648
/* Register defines */
4749
#define GOODIX_REG_COMMAND 0x8040
@@ -109,7 +111,7 @@ static void goodix_calc_cfg_checksum_16(struct goodix_ts_data *ts);
109111

110112
static const struct goodix_chip_data gt1x_chip_data = {
111113
.config_addr = GOODIX_GT1X_REG_CONFIG_DATA,
112-
.config_len = GOODIX_CONFIG_MAX_LENGTH,
114+
.config_len = GOODIX_CONFIG_GT9X_LENGTH,
113115
.check_config = goodix_check_cfg_16,
114116
.calc_config_checksum = goodix_calc_cfg_checksum_16,
115117
};
@@ -130,7 +132,7 @@ static const struct goodix_chip_data gt967_chip_data = {
130132

131133
static const struct goodix_chip_data gt9x_chip_data = {
132134
.config_addr = GOODIX_GT9X_REG_CONFIG_DATA,
133-
.config_len = GOODIX_CONFIG_MAX_LENGTH,
135+
.config_len = GOODIX_CONFIG_GT9X_LENGTH,
134136
.check_config = goodix_check_cfg_8,
135137
.calc_config_checksum = goodix_calc_cfg_checksum_8,
136138
};
@@ -525,7 +527,8 @@ static void goodix_calc_cfg_checksum_16(struct goodix_ts_data *ts)
525527
static int goodix_check_cfg(struct goodix_ts_data *ts,
526528
const struct firmware *cfg)
527529
{
528-
if (cfg->size > GOODIX_CONFIG_MAX_LENGTH) {
530+
if (cfg->size < GOODIX_CONFIG_MIN_LENGTH ||
531+
cfg->size > GOODIX_CONFIG_MAX_LENGTH) {
529532
dev_err(&ts->client->dev,
530533
"The length of the config fw is not correct");
531534
return -EINVAL;

0 commit comments

Comments
 (0)