From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42236) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dLAGU-0007Kw-LD for qemu-devel@nongnu.org; Wed, 14 Jun 2017 11:31:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dLAGP-0003u5-OC for qemu-devel@nongnu.org; Wed, 14 Jun 2017 11:31:26 -0400 From: Max Reitz Date: Wed, 14 Jun 2017 17:31:01 +0200 Message-Id: <20170614153102.9077-4-mreitz@redhat.com> In-Reply-To: <20170614153102.9077-1-mreitz@redhat.com> References: <20170614153102.9077-1-mreitz@redhat.com> Subject: [Qemu-devel] [PATCH 3/4] block: qobject_is_equal() in bdrv_reopen_prepare() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, Max Reitz , Kevin Wolf , Markus Armbruster Currently, bdrv_reopen_prepare() assumes that all BDS options are strings. However, this is not the case if the BDS has been created through the json: pseudo-protocol or blockdev-add. Note that the user-invokable reopen command is an HMP command, so you can only specify strings there. Therefore, specifying a non-string option with the "same" value as it was when originally created will now return an error because the values are supposedly similar (and there is no way for the user to circumvent this but to just not specify the option again -- however, this is still strictly better than just crashing). Signed-off-by: Max Reitz --- block.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/block.c b/block.c index fa1d06d..23424d5 100644 --- a/block.c +++ b/block.c @@ -2950,19 +2950,10 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue, const QDictEntry *entry = qdict_first(reopen_state->options); do { - QString *new_obj = qobject_to_qstring(entry->value); - const char *new = qstring_get_str(new_obj); - /* - * Caution: while qdict_get_try_str() is fine, getting - * non-string types would require more care. When - * bs->options come from -blockdev or blockdev_add, its - * members are typed according to the QAPI schema, but - * when they come from -drive, they're all QString. - */ - const char *old = qdict_get_try_str(reopen_state->bs->options, - entry->key); + QObject *new = entry->value; + QObject *old = qdict_get(reopen_state->bs->options, entry->key); - if (!old || strcmp(new, old)) { + if (!qobject_is_equal(new, old)) { error_setg(errp, "Cannot change the option '%s'", entry->key); ret = -EINVAL; goto error; -- 2.9.4