mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-21 10:12:04 +02:00
util/nvmutil: portable, secure strlen function
xstrxlen ftw Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
+35
-2
@@ -75,6 +75,7 @@ static void set_part_modified(size_t p);
|
|||||||
static void check_part_num(size_t p);
|
static void check_part_num(size_t p);
|
||||||
static void usage(void);
|
static void usage(void);
|
||||||
static size_t xstrxlen(const char *scmp, size_t maxlen);
|
static size_t xstrxlen(const char *scmp, size_t maxlen);
|
||||||
|
static int xstrxcmp(const char *a, const char *b, size_t maxlen);
|
||||||
static void err(int nvm_errval, const char *msg, ...);
|
static void err(int nvm_errval, const char *msg, ...);
|
||||||
static const char *getnvmprogname(void);
|
static const char *getnvmprogname(void);
|
||||||
static void set_err(int errval);
|
static void set_err(int errval);
|
||||||
@@ -372,7 +373,8 @@ set_cmd(int argc, char *argv[])
|
|||||||
if (argc < 3)
|
if (argc < 3)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (strcmp(argv[2], command[cmd_index].str) != 0)
|
if (xstrxcmp(argv[2], command[cmd_index].str,
|
||||||
|
MAX_CMD_LEN) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (argc >= command[cmd_index].argc)
|
if (argc >= command[cmd_index].argc)
|
||||||
@@ -488,7 +490,7 @@ set_io_flags(int argc, char *argv[])
|
|||||||
if (argc < 3)
|
if (argc < 3)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (strcmp(argv[2], "dump") == 0)
|
if (xstrxcmp(argv[2], "dump", MAX_CMD_LEN) == 0)
|
||||||
gbe_flags = O_RDONLY;
|
gbe_flags = O_RDONLY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1118,6 +1120,37 @@ xstrxlen(const char *scmp, size_t maxlen)
|
|||||||
return xstr_index;
|
return xstr_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Portable, secure strcmp() with the same mentality
|
||||||
|
* as our xstrxlen
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
xstrxcmp(const char *a, const char *b, size_t maxlen)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (!a || !b)
|
||||||
|
err(EINVAL, "NULL input to xstrxcmp");
|
||||||
|
|
||||||
|
if (*a == '\0' || *b == '\0')
|
||||||
|
err(EINVAL, "Empty string in xstrxcmp");
|
||||||
|
|
||||||
|
for (i = 0; i < maxlen; i++) {
|
||||||
|
if (a[i] != b[i])
|
||||||
|
return (unsigned char)a[i] - (unsigned char)b[i];
|
||||||
|
|
||||||
|
if (a[i] == '\0')
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
err(EINVAL, "Unterminated string in xstrxcmp");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Should never reach here. This keeps compilers happy.
|
||||||
|
*/
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
err(int nvm_errval, const char *msg, ...)
|
err(int nvm_errval, const char *msg, ...)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user