target/riscv: fix use of uninitialized value

Scan-build reports:
	Logic error: Uninitialized argument value
	riscv.c:2688 2nd function call argument is an uninitialized value

This is a real error cause by running the command "riscv
authdata_write" without arguments. In such case 'value' is not
initialized and is passed to and used by r->authdata_write().

Reorganize the code to:
- detect the correct amount or command's arguments;
- drop the LOG_ERROR() on ERROR_COMMAND_SYNTAX_ERROR;
- drop the 'else' after 'return'.

Change-Id: I62e031220593b8308bc674b753e15d16d4c5c9ac
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/7210
Tested-by: jenkins
Reviewed-by: Jan Matyas <matyas@codasip.com>
Reviewed-by: Tim Newsome <tim@sifive.com>
This commit is contained in:
Antonio Borneo 2022-09-19 15:39:50 +02:00
parent fd2a44ab55
commit 44ed26a1db
1 changed files with 8 additions and 10 deletions

View File

@ -2666,27 +2666,25 @@ COMMAND_HANDLER(riscv_authdata_write)
uint32_t value; uint32_t value;
unsigned int index = 0; unsigned int index = 0;
if (CMD_ARGC == 0) { if (CMD_ARGC == 0 || CMD_ARGC > 2)
/* nop */ return ERROR_COMMAND_SYNTAX_ERROR;
} else if (CMD_ARGC == 1) {
if (CMD_ARGC == 1) {
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], value); COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], value);
} else if (CMD_ARGC == 2) { } else {
COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], index); COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], index);
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], value); COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], value);
} else {
LOG_ERROR("Command takes at most 2 arguments");
return ERROR_COMMAND_SYNTAX_ERROR;
} }
struct target *target = get_current_target(CMD_CTX); struct target *target = get_current_target(CMD_CTX);
RISCV_INFO(r); RISCV_INFO(r);
if (r->authdata_write) { if (!r->authdata_write) {
return r->authdata_write(target, value, index);
} else {
LOG_ERROR("authdata_write is not implemented for this target."); LOG_ERROR("authdata_write is not implemented for this target.");
return ERROR_FAIL; return ERROR_FAIL;
} }
return r->authdata_write(target, value, index);
} }
COMMAND_HANDLER(riscv_dmi_read) COMMAND_HANDLER(riscv_dmi_read)