[libvirt] [PATCH v2 0/5] Combine various query-block json call paths
John Ferlan
jferlan at redhat.com
Mon Oct 3 19:21:18 UTC 2016
On 10/03/2016 10:49 AM, Peter Krempa wrote:
> On Mon, Oct 03, 2016 at 10:46:07 -0400, John Ferlan wrote:
>> [...]
>>
>>>> Since you didn't explicitly state which checks, I'm assuming you mean
>>>> either:
>>>>
>>>> if (!(devices = virJSONValueObjectGetArray(reply, "return"))) {
>>>> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>>>> _("block info reply was missing device list"));
>>>> goto cleanup;
>>>> }
>>>>
>>>> I did consider moving this into the helper and returning devices but ran
>>>> into the problem that the helper would virJSONValueFree(reply) while
>>>> returning devices which is then used by the for loop to get each device
>>>> (dev = virJSONValueArrayGet(devices, i)).
>>>
>>> What's the problem wit that? Creating a function that steals the value
>>> from a JSON object should be pretty simple. We have one that steals
>>> array members: virJSONValueArraySteal.
>>>
>>>> Since devices points into reply, I didn't think that would be such a
>>>> good idea to free reply and then return devices. Returning reply anda
>>>
>>> Why not?
>>>
>>
>>
>> Let's assume the helper is:
>>
>> +static virJSONValuePtr
>> +qemuMonitorJSONQueryBlock(qemuMonitorPtr mon)
>> +{
>> + virJSONValuePtr cmd;
>> + virJSONValuePtr reply = NULL;
>> + virJSONValuePtr devices = NULL;
>> +
>> + if (!(cmd = qemuMonitorJSONMakeCommand("query-block", NULL)))
>> + return NULL;
>> +
>> + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0 ||
>> + qemuMonitorJSONCheckError(cmd, reply) < 0)
>> + goto cleanup;
>> +
>> + if (!(devices = virJSONValueObjectGetArray(reply, "return"))) {
>> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> + _("query-block reply was missing device list"));
>> + goto cleanup;
>> + }
>> +
>> + cleanup:
>> + virJSONValueFree(cmd);
>> + virJSONValueFree(reply);
>> + return devices;
>> +}
>>
>> Wouldn't "reply" being free'd cause access problems for devices? Is
>> there other code somewhere else that gets the array, free's the object,
>> then parses the array? I didn't find any (for good reason)...
>
> It would as virJSONValueFree is recursive and thus everything would be
> freed. Hence my comment of adding the "steal" function.
>
I find it ironic that it's more desirable to add code to virjson.c (1
external and 2 static), virjson.h, and libvirt.private_syms for the
single purpose that it's more desirable to have 3 API's follow the same
steps and it's less desirable to combine those API's in some manner. We
have a few API's that will pass/receive many parameters including
multiple NULL's and make the proper decision based on some key for the
function.
We have a difference of opinion on the way to do this - that's fine. I'm
moving on. No sense in beating this dead horse anymore.
John
More information about the libvir-list
mailing list