Input: hideep - fix the uninitialized use in hideep_nvm_unlock()
authorYizhuo Zhai <yzhai003@ucr.edu>
Sun, 20 Jun 2021 05:26:50 +0000 (22:26 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sun, 20 Jun 2021 05:36:28 +0000 (22:36 -0700)
Inside function hideep_nvm_unlock(), variable "unmask_code" could
be uninitialized if hideep_pgm_r_reg() returns error, however, it
is used in the later if statement after an "and" operation, which
is potentially unsafe.

Signed-off-by: Yizhuo <yzhai003@ucr.edu>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/hideep.c

index ddad4a82a5e55c28635f33f8c5f91490e5c81e96..e9547ee297564d21e3e6782304ba8a2938ae3de6 100644 (file)
@@ -361,13 +361,16 @@ static int hideep_enter_pgm(struct hideep_ts *ts)
        return -EIO;
 }
 
-static void hideep_nvm_unlock(struct hideep_ts *ts)
+static int hideep_nvm_unlock(struct hideep_ts *ts)
 {
        u32 unmask_code;
+       int error;
 
        hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_SFR_RPAGE);
-       hideep_pgm_r_reg(ts, 0x0000000C, &unmask_code);
+       error = hideep_pgm_r_reg(ts, 0x0000000C, &unmask_code);
        hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_DEFAULT_PAGE);
+       if (error)
+               return error;
 
        /* make it unprotected code */
        unmask_code &= ~HIDEEP_PROT_MODE;
@@ -384,6 +387,8 @@ static void hideep_nvm_unlock(struct hideep_ts *ts)
        NVM_W_SFR(HIDEEP_NVM_MASK_OFS, ts->nvm_mask);
        SET_FLASH_HWCONTROL();
        hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_DEFAULT_PAGE);
+
+       return 0;
 }
 
 static int hideep_check_status(struct hideep_ts *ts)
@@ -462,7 +467,9 @@ static int hideep_program_nvm(struct hideep_ts *ts,
        u32 addr = 0;
        int error;
 
-       hideep_nvm_unlock(ts);
+       error = hideep_nvm_unlock(ts);
+       if (error)
+               return error;
 
        while (ucode_len > 0) {
                xfer_len = min_t(size_t, ucode_len, HIDEEP_NVM_PAGE_SIZE);