mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-19 18:43:08 +02:00
util/nvmutil: use enum for command index
if the enum is messed up, this patch also prevents that. this is not to catch a runtime error, but to intentionally trip up a maintainer that screws up, prompting them to fix their future mistake. we previously used a pointer directly, without even checking index/NULL - that too is now covered, except that we now use an indice for command[] and execute the command from that, rather than directly declaring a pointer. Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
+37
-14
@@ -147,27 +147,46 @@ static const char rmac[] = "xx:xx:xx:xx:xx:xx";
|
|||||||
static const char *fname;
|
static const char *fname;
|
||||||
static const char *argv0;
|
static const char *argv0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Used as indices for command[]
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
CMD_DUMP,
|
||||||
|
CMD_SETMAC,
|
||||||
|
CMD_SWAP,
|
||||||
|
CMD_COPY,
|
||||||
|
CMD_BRICK,
|
||||||
|
CMD_SETCHECKSUM
|
||||||
|
};
|
||||||
|
#define CMD_NULL -1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Those enum values are used for .chk in
|
||||||
|
* the command struct. Then, even if an index
|
||||||
|
* is valid, if it doesn't match .chk, run_cmd()
|
||||||
|
* will fail. This mitigates against the possibility
|
||||||
|
* of a maintainer (read: you) screwing up the enum,
|
||||||
|
* which otherwise enables easier understanding.
|
||||||
|
*
|
||||||
|
* In other words: the order of the CMD enum must
|
||||||
|
* precisely match the order of the command struct.
|
||||||
|
*/
|
||||||
struct commands {
|
struct commands {
|
||||||
|
size_t chk; /* use by in later check on run_cmd,
|
||||||
|
against cmd index, to verify correct enum order */
|
||||||
const char *str;
|
const char *str;
|
||||||
void (*run)(void);
|
void (*run)(void);
|
||||||
int args;
|
int args;
|
||||||
uint8_t invert;
|
uint8_t invert;
|
||||||
};
|
};
|
||||||
static const struct commands command[] = {
|
static const struct commands command[] = {
|
||||||
{ "dump", cmd_dump, 3, 0 },
|
{ CMD_DUMP, "dump", cmd_dump, 3, 0 },
|
||||||
{ "setmac", cmd_setmac, 3, 0 },
|
{ CMD_SETMAC, "setmac", cmd_setmac, 3, 0 },
|
||||||
{ "swap", cmd_swap, 3, 1 },
|
{ CMD_SWAP, "swap", cmd_swap, 3, 1 },
|
||||||
{ "copy", cmd_copy, 4, 1 },
|
{ CMD_COPY, "copy", cmd_copy, 4, 1 },
|
||||||
{ "brick", cmd_brick, 4, 0 },
|
{ CMD_BRICK, "brick", cmd_brick, 4, 0 },
|
||||||
{ "setchecksum", cmd_setchecksum, 4, 0 },
|
{ CMD_SETCHECKSUM, "setchecksum", cmd_setchecksum, 4, 0 },
|
||||||
};
|
};
|
||||||
#define CMD_NULL -1
|
|
||||||
#define CMD_DUMP 0
|
|
||||||
#define CMD_SETMAC 1
|
|
||||||
#define CMD_SWAP 2
|
|
||||||
#define CMD_COPY 3
|
|
||||||
#define CMD_BRICK 4
|
|
||||||
#define CMD_SETCHECKSUM 5
|
|
||||||
|
|
||||||
static ssize_t cmd = CMD_NULL;
|
static ssize_t cmd = CMD_NULL;
|
||||||
|
|
||||||
@@ -352,7 +371,11 @@ run_cmd(ssize_t c)
|
|||||||
size_t d = (size_t)c;
|
size_t d = (size_t)c;
|
||||||
|
|
||||||
if (d >= items(command))
|
if (d >= items(command))
|
||||||
err(ECANCELED, "Invalid run_cmd arg: %zd", c);
|
err(ECANCELED, "run_cmd: Invalid run_cmd arg: %zd", c);
|
||||||
|
|
||||||
|
if (d != command[d].chk)
|
||||||
|
err(ECANCELED, "run_cmd: Invalid chk value (%zu) vs arg: %zd",
|
||||||
|
command[d].chk, c);
|
||||||
|
|
||||||
command[d].run();
|
command[d].run();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user