if (file != NULL) {
filename = blk_bs(file)->filename;
} else {
+ /*
+ * Caution: while qdict_get_try_str() is fine, getting
+ * non-string types would require more care. When @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.
+ */
filename = qdict_get_try_str(options, "filename");
}
BlockDriver *drv = NULL;
Error *local_err = NULL;
+ /*
+ * Caution: while qdict_get_try_str() is fine, getting non-string
+ * types would require more care. When @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.
+ */
drvname = qdict_get_try_str(*options, "driver");
if (drvname) {
drv = bdrv_find_format(drvname);
}
/* Find the right block driver */
+ /* See cautionary note on accessing @options above */
filename = qdict_get_try_str(*options, "filename");
if (!drvname && protocol) {
qdict_extract_subqdict(parent_options, &options, bdref_key_dot);
g_free(bdref_key_dot);
+ /*
+ * Caution: while qdict_get_try_str() is fine, getting non-string
+ * types would require more care. When @parent_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.
+ */
reference = qdict_get_try_str(parent_options, bdref_key);
if (reference || qdict_haskey(options, "file.filename")) {
backing_filename[0] = '\0';
qdict_extract_subqdict(options, &image_options, bdref_key_dot);
g_free(bdref_key_dot);
+ /*
+ * Caution: while qdict_get_try_str() is fine, getting non-string
+ * types would require more care. When @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.
+ */
reference = qdict_get_try_str(options, bdref_key);
if (!filename && !reference && !qdict_size(image_options)) {
if (!allow_none) {
goto fail;
}
- /* Set the BDRV_O_RDWR and BDRV_O_ALLOW_RDWR flags.
- * FIXME: we're parsing the QDict to avoid having to create a
- * QemuOpts just for this, but neither option is optimal. */
+ /*
+ * Set the BDRV_O_RDWR and BDRV_O_ALLOW_RDWR flags.
+ * Caution: getting a boolean member of @options requires care.
+ * When @options come from -blockdev or blockdev_add, members are
+ * typed according to the QAPI schema, but when they come from
+ * -drive, they're all QString.
+ */
if (g_strcmp0(qdict_get_try_str(options, BDRV_OPT_READ_ONLY), "on") &&
!qdict_get_try_bool(options, BDRV_OPT_READ_ONLY, false)) {
flags |= (BDRV_O_RDWR | BDRV_O_ALLOW_RDWR);
options = qdict_clone_shallow(options);
/* Find the right image format driver */
+ /* See cautionary note on accessing @options above */
drvname = qdict_get_try_str(options, "driver");
if (drvname) {
drv = bdrv_find_format(drvname);
assert(drvname || !(flags & BDRV_O_PROTOCOL));
+ /* See cautionary note on accessing @options above */
backing = qdict_get_try_str(options, "backing");
if (backing && *backing == '\0') {
flags |= BDRV_O_NO_BACKING;
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);