aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2010-01-25 14:23:04 +0100
committerAnthony Liguori <aliguori@us.ibm.com>2010-02-03 12:36:26 -0600
commit5667c493c430256c99002b719383f0e911cb53a8 (patch)
tree0a8bdc5095e4d2ac855e05549c3856d728821a16
parent3350a4dd07cf735c323655cd3c2119283ff9347e (diff)
monitor: Use argument type 'b' for migrate_set_speed
Before, it used type 's', which strips quotes and interprets escapes, and is quite inappropriate for QMP. Negative arguments are no flushed to zero. Before, they were cast to uint32_t, which wrecked the sign. Ridiculously large arguments including infinities are now rejected. Before, they were interpreted as zero. Same for NaN. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--migration.c18
-rw-r--r--qemu-monitor.hx2
2 files changed, 4 insertions, 16 deletions
diff --git a/migration.c b/migration.c
index 598f8df5c4..6abdc65149 100644
--- a/migration.c
+++ b/migration.c
@@ -109,23 +109,11 @@ void do_migrate_cancel(Monitor *mon, const QDict *qdict, QObject **ret_data)
void do_migrate_set_speed(Monitor *mon, const QDict *qdict)
{
double d;
- char *ptr;
FdMigrationState *s;
- const char *value = qdict_get_str(qdict, "value");
-
- d = strtod(value, &ptr);
- switch (*ptr) {
- case 'G': case 'g':
- d *= 1024;
- case 'M': case 'm':
- d *= 1024;
- case 'K': case 'k':
- d *= 1024;
- default:
- break;
- }
- max_throttle = (uint32_t)d;
+ d = qdict_get_double(qdict, "value");
+ d = MAX(0, MIN(UINT32_MAX, d));
+ max_throttle = d;
s = migrate_to_fms(current_migration);
if (s && s->file) {
diff --git a/qemu-monitor.hx b/qemu-monitor.hx
index b51bb47f25..b30301e7d5 100644
--- a/qemu-monitor.hx
+++ b/qemu-monitor.hx
@@ -761,7 +761,7 @@ ETEXI
{
.name = "migrate_set_speed",
- .args_type = "value:s",
+ .args_type = "value:b",
.params = "value",
.help = "set maximum speed (in bytes) for migrations",
.mhandler.cmd = do_migrate_set_speed,