cbfstool: Check arguments to strtoul() where appropriate
The interface to strtoul() is a weird mess. It may or may not set errno if no conversion is done. So check for empty strings and trailing characters. Change-Id: I82373d2a0102fc89144bd12376b5ea3b10c70153 Signed-off-by: Nico Huber <nico.h@gmx.de> Reviewed-on: https://review.coreboot.org/16012 Tested-by: build bot (Jenkins) Reviewed-by: Idwer Vollering <vidwer@gmail.com> Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
parent
f641a27b63
commit
9ade717571
|
@ -1350,24 +1350,51 @@ int main(int argc, char **argv)
|
||||||
param.source_region = optarg;
|
param.source_region = optarg;
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
param.baseaddress = strtoul(optarg, NULL, 0);
|
param.baseaddress = strtoul(optarg, &suffix, 0);
|
||||||
|
if (!*optarg || (suffix && *suffix)) {
|
||||||
|
ERROR("Invalid base address '%s'.\n",
|
||||||
|
optarg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
// baseaddress may be zero on non-x86, so we
|
// baseaddress may be zero on non-x86, so we
|
||||||
// need an explicit "baseaddress_assigned".
|
// need an explicit "baseaddress_assigned".
|
||||||
param.baseaddress_assigned = 1;
|
param.baseaddress_assigned = 1;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
param.loadaddress = strtoul(optarg, NULL, 0);
|
param.loadaddress = strtoul(optarg, &suffix, 0);
|
||||||
|
if (!*optarg || (suffix && *suffix)) {
|
||||||
|
ERROR("Invalid load address '%s'.\n",
|
||||||
|
optarg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
param.entrypoint = strtoul(optarg, NULL, 0);
|
param.entrypoint = strtoul(optarg, &suffix, 0);
|
||||||
|
if (!*optarg || (suffix && *suffix)) {
|
||||||
|
ERROR("Invalid entry point '%s'.\n",
|
||||||
|
optarg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
param.size = strtoul(optarg, &suffix, 0);
|
param.size = strtoul(optarg, &suffix, 0);
|
||||||
if (tolower((int)suffix[0])=='k') {
|
if (!*optarg) {
|
||||||
param.size *= 1024;
|
ERROR("Empty size specified.\n");
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
if (tolower((int)suffix[0])=='m') {
|
switch (tolower((int)suffix[0])) {
|
||||||
|
case 'k':
|
||||||
|
param.size *= 1024;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
param.size *= 1024 * 1024;
|
param.size *= 1024 * 1024;
|
||||||
|
break;
|
||||||
|
case '\0':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERROR("Invalid suffix for size '%s'.\n",
|
||||||
|
optarg);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'B':
|
case 'B':
|
||||||
|
@ -1375,24 +1402,49 @@ int main(int argc, char **argv)
|
||||||
break;
|
break;
|
||||||
case 'H':
|
case 'H':
|
||||||
param.headeroffset = strtoul(
|
param.headeroffset = strtoul(
|
||||||
optarg, NULL, 0);
|
optarg, &suffix, 0);
|
||||||
|
if (!*optarg || (suffix && *suffix)) {
|
||||||
|
ERROR("Invalid header offset '%s'.\n",
|
||||||
|
optarg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
param.headeroffset_assigned = 1;
|
param.headeroffset_assigned = 1;
|
||||||
break;
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
param.alignment = strtoul(optarg, NULL, 0);
|
param.alignment = strtoul(optarg, &suffix, 0);
|
||||||
|
if (!*optarg || (suffix && *suffix)) {
|
||||||
|
ERROR("Invalid alignment '%s'.\n",
|
||||||
|
optarg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
param.pagesize = strtoul(optarg, NULL, 0);
|
param.pagesize = strtoul(optarg, &suffix, 0);
|
||||||
|
if (!*optarg || (suffix && *suffix)) {
|
||||||
|
ERROR("Invalid page size '%s'.\n",
|
||||||
|
optarg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
param.cbfsoffset = strtoul(optarg, NULL, 0);
|
param.cbfsoffset = strtoul(optarg, &suffix, 0);
|
||||||
|
if (!*optarg || (suffix && *suffix)) {
|
||||||
|
ERROR("Invalid cbfs offset '%s'.\n",
|
||||||
|
optarg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
param.cbfsoffset_assigned = 1;
|
param.cbfsoffset_assigned = 1;
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
param.filename = optarg;
|
param.filename = optarg;
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
param.u64val = strtoull(optarg, NULL, 0);
|
param.u64val = strtoull(optarg, &suffix, 0);
|
||||||
|
if (!*optarg || (suffix && *suffix)) {
|
||||||
|
ERROR("Invalid int parameter '%s'.\n",
|
||||||
|
optarg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
param.fill_partial_upward = true;
|
param.fill_partial_upward = true;
|
||||||
|
@ -1404,7 +1456,13 @@ int main(int argc, char **argv)
|
||||||
param.show_immutable = true;
|
param.show_immutable = true;
|
||||||
break;
|
break;
|
||||||
case 'x':
|
case 'x':
|
||||||
param.fit_empty_entries = strtol(optarg, NULL, 0);
|
param.fit_empty_entries = strtol(
|
||||||
|
optarg, &suffix, 0);
|
||||||
|
if (!*optarg || (suffix && *suffix)) {
|
||||||
|
ERROR("Invalid number of fit entries "
|
||||||
|
"'%s'.\n", optarg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
verbose++;
|
verbose++;
|
||||||
|
|
Loading…
Reference in New Issue