提交 606caa0a 编写于 作者: M Markus Armbruster

qemu-img: Wrap cvtnum() around qemu_strtosz()

Cc: Kevin Wolf <kwolf@redhat.com>
Cc: Max Reitz <mreitz@redhat.com>
Cc: qemu-block@nongnu.org
Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
Reviewed-by: NEric Blake <eblake@redhat.com>
Message-Id: <1487708048-2131-21-git-send-email-armbru@redhat.com>
上级 dab9cc92
...@@ -368,6 +368,19 @@ static int add_old_style_options(const char *fmt, QemuOpts *opts, ...@@ -368,6 +368,19 @@ static int add_old_style_options(const char *fmt, QemuOpts *opts,
return 0; return 0;
} }
static int64_t cvtnum(const char *s)
{
char *end;
int64_t ret;
ret = qemu_strtosz(s, &end);
if (*end != '\0') {
/* Detritus at the end of the string */
return -EINVAL;
}
return ret;
}
static int img_create(int argc, char **argv) static int img_create(int argc, char **argv)
{ {
int c; int c;
...@@ -461,9 +474,9 @@ static int img_create(int argc, char **argv) ...@@ -461,9 +474,9 @@ static int img_create(int argc, char **argv)
/* Get image size, if specified */ /* Get image size, if specified */
if (optind < argc) { if (optind < argc) {
int64_t sval; int64_t sval;
char *end;
sval = qemu_strtosz(argv[optind++], &end); sval = cvtnum(argv[optind++]);
if (sval < 0 || *end) { if (sval < 0) {
if (sval == -ERANGE) { if (sval == -ERANGE) {
error_report("Image size must be less than 8 EiB!"); error_report("Image size must be less than 8 EiB!");
} else { } else {
...@@ -1863,9 +1876,9 @@ static int img_convert(int argc, char **argv) ...@@ -1863,9 +1876,9 @@ static int img_convert(int argc, char **argv)
case 'S': case 'S':
{ {
int64_t sval; int64_t sval;
char *end;
sval = qemu_strtosz(optarg, &end); sval = cvtnum(optarg);
if (sval < 0 || *end) { if (sval < 0) {
error_report("Invalid minimum zero buffer size for sparse output specified"); error_report("Invalid minimum zero buffer size for sparse output specified");
ret = -1; ret = -1;
goto fail_getopt; goto fail_getopt;
...@@ -3650,10 +3663,8 @@ static int img_bench(int argc, char **argv) ...@@ -3650,10 +3663,8 @@ static int img_bench(int argc, char **argv)
break; break;
case 'o': case 'o':
{ {
char *end; offset = cvtnum(optarg);
errno = 0; if (offset < 0) {
offset = qemu_strtosz(optarg, &end);
if (offset < 0|| *end) {
error_report("Invalid offset specified"); error_report("Invalid offset specified");
return 1; return 1;
} }
...@@ -3666,10 +3677,9 @@ static int img_bench(int argc, char **argv) ...@@ -3666,10 +3677,9 @@ static int img_bench(int argc, char **argv)
case 's': case 's':
{ {
int64_t sval; int64_t sval;
char *end;
sval = qemu_strtosz(optarg, &end); sval = cvtnum(optarg);
if (sval < 0 || sval > INT_MAX || *end) { if (sval < 0 || sval > INT_MAX) {
error_report("Invalid buffer size specified"); error_report("Invalid buffer size specified");
return 1; return 1;
} }
...@@ -3680,10 +3690,9 @@ static int img_bench(int argc, char **argv) ...@@ -3680,10 +3690,9 @@ static int img_bench(int argc, char **argv)
case 'S': case 'S':
{ {
int64_t sval; int64_t sval;
char *end;
sval = qemu_strtosz(optarg, &end); sval = cvtnum(optarg);
if (sval < 0 || sval > INT_MAX || *end) { if (sval < 0 || sval > INT_MAX) {
error_report("Invalid step size specified"); error_report("Invalid step size specified");
return 1; return 1;
} }
...@@ -3842,12 +3851,11 @@ static int img_dd_bs(const char *arg, ...@@ -3842,12 +3851,11 @@ static int img_dd_bs(const char *arg,
struct DdIo *in, struct DdIo *out, struct DdIo *in, struct DdIo *out,
struct DdInfo *dd) struct DdInfo *dd)
{ {
char *end;
int64_t res; int64_t res;
res = qemu_strtosz(arg, &end); res = cvtnum(arg);
if (res <= 0 || res > INT_MAX || *end) { if (res <= 0 || res > INT_MAX) {
error_report("invalid number: '%s'", arg); error_report("invalid number: '%s'", arg);
return 1; return 1;
} }
...@@ -3860,11 +3868,9 @@ static int img_dd_count(const char *arg, ...@@ -3860,11 +3868,9 @@ static int img_dd_count(const char *arg,
struct DdIo *in, struct DdIo *out, struct DdIo *in, struct DdIo *out,
struct DdInfo *dd) struct DdInfo *dd)
{ {
char *end; dd->count = cvtnum(arg);
dd->count = qemu_strtosz(arg, &end); if (dd->count < 0) {
if (dd->count < 0 || *end) {
error_report("invalid number: '%s'", arg); error_report("invalid number: '%s'", arg);
return 1; return 1;
} }
...@@ -3894,11 +3900,9 @@ static int img_dd_skip(const char *arg, ...@@ -3894,11 +3900,9 @@ static int img_dd_skip(const char *arg,
struct DdIo *in, struct DdIo *out, struct DdIo *in, struct DdIo *out,
struct DdInfo *dd) struct DdInfo *dd)
{ {
char *end; in->offset = cvtnum(arg);
in->offset = qemu_strtosz(arg, &end);
if (in->offset < 0 || *end) { if (in->offset < 0) {
error_report("invalid number: '%s'", arg); error_report("invalid number: '%s'", arg);
return 1; return 1;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册