[PATCH v2 09/15] softmmu/qdev-monitor: add error handling in qdev_set_id
Damien Hedde
damien.hedde at greensocs.com
Wed Oct 13 13:10:38 UTC 2021
On 10/11/21 23:00, Eric Blake wrote:
> On Fri, Oct 08, 2021 at 03:34:36PM +0200, Kevin Wolf wrote:
>> From: Damien Hedde <damien.hedde at greensocs.com>
>>
>> qdev_set_id() is mostly used when the user adds a device (using
>> -device cli option or device_add qmp command). This commit adds
>> an error parameter to handle the case where the given id is
>> already taken.
>>
>> Also document the function and add a return value in order to
>> be able to capture success/failure: the function now returns the
>> id in case of success, or NULL in case of failure.
>>
>> The commit modifies the 2 calling places (qdev-monitor and
>> xen-legacy-backend) to add the error object parameter.
>>
>> Note that the id is, right now, guaranteed to be unique because
>> all ids came from the "device" QemuOptsList where the id is used
>> as key. This addition is a preparation for a future commit which
>> will relax the uniqueness.
>>
>> Signed-off-by: Damien Hedde <damien.hedde at greensocs.com>
>> Signed-off-by: Kevin Wolf <kwolf at redhat.com>
>> ---
>
>> + } else {
>> + error_setg(errp, "Duplicate device ID '%s'", id);
>> + return NULL;
>
> id is not freed on this error path...
>
>>
>> DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>> @@ -691,7 +703,13 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>> }
>> }
>>
>> - qdev_set_id(dev, g_strdup(qemu_opts_id(opts)));
>> + /*
>> + * set dev's parent and register its id.
>> + * If it fails it means the id is already taken.
>> + */
>> + if (!qdev_set_id(dev, g_strdup(qemu_opts_id(opts)), errp)) {
>> + goto err_del_dev;
>
> ...nor on this, which means the g_strdup() leaks on failure.
>
Since we strdup the id just before calling qdev_set_id.
Maybe we should do the the strdup in qdev_set_id (and free things on
error there too). It seems simplier than freeing things on the callee
side just in case of an error.
Damien
More information about the libvir-list
mailing list