Commit cac7100d authored by Yizhuo Zhai's avatar Yizhuo Zhai Committed by Dmitry Torokhov
Browse files

Input: hideep - fix the uninitialized use in hideep_nvm_unlock()



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: default avatarYizhuo <yzhai003@ucr.edu>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent eacacdb5
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -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);