summaryrefslogtreecommitdiffstats
path: root/qmp.c
diff options
context:
space:
mode:
authorPeter Maydell2014-04-28 13:56:33 +0200
committerPeter Maydell2014-04-28 13:56:34 +0200
commit13de54eedd40a1b01fa7176dfb96d1c22c5cfa71 (patch)
tree6662ce703da44cec201298be591d4a263d027999 /qmp.c
parentMerge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into ... (diff)
parentmonitor: fix qmp_getfd() fd leak in error case (diff)
downloadqemu-13de54eedd40a1b01fa7176dfb96d1c22c5cfa71.tar.gz
qemu-13de54eedd40a1b01fa7176dfb96d1c22c5cfa71.tar.xz
qemu-13de54eedd40a1b01fa7176dfb96d1c22c5cfa71.zip
Merge remote-tracking branch 'remotes/qmp-unstable/queue/qmp' into staging
* remotes/qmp-unstable/queue/qmp: monitor: fix qmp_getfd() fd leak in error case HMP: support specifying dump format for dump-guest-memory HMP: fix doc of dump-guest-memory qmp: object-add: Validate class before creating object monitor: Add device_add and device_del completion. monitor: Add command_completion callback to mon_cmd_t. monitor: Fix drive_del id argument type completion. error: Remove some unused headers qerror.h: Replace QERR_NOT_SUPPORTED with QERR_UNSUPPORTED qerror.h: Remove QERR defines that are only used once qerror.h: Remove unused error classes error: Print error_report() to stderr if using qmp monitor: Remove unused monitor_print_filename error: Privatize error_print_loc vnc: Remove default_mon usage slirp: Remove default_mon usage Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'qmp.c')
-rw-r--r--qmp.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/qmp.c b/qmp.c
index 87a28f797d..74107be41b 100644
--- a/qmp.c
+++ b/qmp.c
@@ -166,7 +166,7 @@ void qmp_cont(Error **errp)
Error *local_err = NULL;
if (runstate_needs_reset()) {
- error_set(errp, QERR_RESET_REQUIRED);
+ error_setg(errp, "Resetting the Virtual Machine is required");
return;
} else if (runstate_check(RUN_STATE_SUSPENDED)) {
return;
@@ -540,14 +540,27 @@ void object_add(const char *type, const char *id, const QDict *qdict,
Visitor *v, Error **errp)
{
Object *obj;
+ ObjectClass *klass;
const QDictEntry *e;
Error *local_err = NULL;
- if (!object_class_by_name(type)) {
+ klass = object_class_by_name(type);
+ if (!klass) {
error_setg(errp, "invalid class name");
return;
}
+ if (!object_class_dynamic_cast(klass, TYPE_USER_CREATABLE)) {
+ error_setg(errp, "object type '%s' isn't supported by object-add",
+ type);
+ return;
+ }
+
+ if (object_class_is_abstract(klass)) {
+ error_setg(errp, "object type '%s' is abstract", type);
+ return;
+ }
+
obj = object_new(type);
if (qdict) {
for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) {
@@ -558,12 +571,6 @@ void object_add(const char *type, const char *id, const QDict *qdict,
}
}
- if (!object_dynamic_cast(obj, TYPE_USER_CREATABLE)) {
- error_setg(&local_err, "object type '%s' isn't supported by object-add",
- type);
- goto out;
- }
-
user_creatable_complete(obj, &local_err);
if (local_err) {
goto out;