[libvirt] [PATCH 1/3] conf/domain_conf: usevirStringParseYesNohelper

maozy maozhongyi at cmss.chinamobile.com
Thu Oct 17 01:20:46 UTC 2019



On 10/16/19 7:02 PM, Michal Privoznik wrote:
> On 10/16/19 12:10 PM, maozy wrote:
>> Hi, Michal
>>
>> On 10/16/19 4:38 PM, Michal Privoznik wrote:
>>> On 10/16/19 4:39 AM, Mao Zhongyi wrote:
>>>> This helper performs a conversion from a "yes|no" string
>>>> to a corresponding boolean, and several conversions were
>>>> already done, but there are still some omissions.
>>>>
>>>> For most of the remaining usages in domain_conf.c only
>>>> "yes" is explicitly checked for. This means all other
>>>> values are implicitly handled as 'false'. In this case,
>>>> use virStringParseYesNo, but if it returns -1, don't
>>>> raise an error but set the bool value to false.
>>>>
>>>> Cc: crobinso at redhat.com
>>>> Cc: berrange at redhat.com
>>>> Cc: abologna at redhat.com
>>>> Cc: laine at laine.org
>>>> Cc: phrdina at redhat.com
>>>> Cc: mkletzan at redhat.com
>>>> Cc: g.sho1500 at gmail.com
>>>>
>>>> Signed-off-by: Mao Zhongyi <maozhongyi at cmss.chinamobile.com>
>>>> Signed-off-by: Zhang Shengju <zhangshengju at cmss.chinamobile.com>
>>>> ---
>>>>   src/conf/domain_conf.c | 30 ++++++++++++++----------------
>>>>   1 file changed, 14 insertions(+), 16 deletions(-)
>>>>
>>>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>>>> index 10d6bf0eea..7420658726 100644
>>>> --- a/src/conf/domain_conf.c
>>>> +++ b/src/conf/domain_conf.c
>>>> @@ -7601,8 +7601,8 @@ 
>>>> virDomainHostdevSubsysUSBDefParseXML(xmlNodePtr node,
>>>>       }
>>>>       if ((autoAddress = virXMLPropString(node, "autoAddress"))) {
>>>> -        if (STREQ(autoAddress, "yes"))
>>>> -            usbsrc->autoAddress = true;
>>>> +        if (virStringParseYesNo(autoAddress, &usbsrc->autoAddress) 
>>>> < 0)
>>>> +            usbsrc->autoAddress = false;
>>>
>>> I think we should either report a proper error here or don't touch 
>>> this line (because this attribute is generated by libvirt itself, it 
>>> doesn't come from an user).
>>
>> This patch replaces all STREQs that explicitly handle 'yes' to true,
>> reserving the original implicitly handling of other values to false,
>> so not report an error, which is also the recommendation of Cole
>> Robinson in BiteSizedtasks. Therefor, I'm not very sure whether it
>> is better to report an error in this case? If indeed, will fix it in v2.
> 
> Alright then. But what we can use then is:
> 
> ignore_value(virStringParseYesNo(autoAddress, &usbsrc->autoAddress));
> 
> which is equivallent to existing code and also shorter.
> 
>>
>>>
>>>>       }
>>>>       /* Product can validly be 0, so we need some extra help to 
>>>> determine
>>>> @@ -8168,8 +8168,8 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr 
>>>> node,
>>>>        * (e.g. <interface>) with type='hostdev')
>>>>        */
>>>>       if ((managed = virXMLPropString(node, "managed")) != NULL) {
>>>> -        if (STREQ(managed, "yes"))
>>>> -            def->managed = true;
>>>> +        if (virStringParseYesNo(managed, &def->managed) < 0)
>>>> +            def->managed = false;
>>>
>>> Here we need to report a proper error because "managed" attribute 
>>> comes from user, therefore risk of an user providing invalid value is 
>>> high compared to the first hunk. But if we want to be consistent we 
>>> should report error in both cases.
>>>
>>>>       }
>>>>       sgio = virXMLPropString(node, "sgio");
>>>> @@ -13807,9 +13807,7 @@ 
>>>> virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def,
>>>>       if (autoGenerated &&
>>>>           flags & VIR_DOMAIN_DEF_PARSE_STATUS) {
>>>> -        if (STREQ(autoGenerated, "yes")) {
>>>> -            def->autoGenerated = true;
>>>> -        } else if (STRNEQ(autoGenerated, "no")) {
>>>> +        if (virStringParseYesNo(autoGenerated, &def->autoGenerated) 
>>>> < 0) {
>>>>               virReportError(VIR_ERR_XML_ERROR,
>>>>                              _("Invalid autoGenerated value: %s"),
>>>>                              autoGenerated);
>>>
>>> This one is correct.
>>>
>>>> @@ -13939,12 +13937,11 @@ 
>>>> virDomainGraphicsDefParseXMLVNC(virDomainGraphicsDefPtr def,
>>>>       }
>>>>       if (autoport) {
>>>> -        if (STREQ(autoport, "yes")) {
>>>> -            if (flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)
>>>> -                def->data.vnc.port = 0;
>>>> -            def->data.vnc.autoport = true;
>>>> -        } else {
>>>> +        if (virStringParseYesNo(autoport, &def->data.vnc.autoport) 
>>>> < 0) {
>>>>               def->data.vnc.autoport = false;
>>>> +        } else {
>>>> +            if (def->data.vnc.autoport && flags & 
>>>> VIR_DOMAIN_DEF_PARSE_INACTIVE)
>>>> +                def->data.vnc.port = 0;
>>>
>>> This doesn't need to go under else branch really.
>>
>> right
>>>
>>>>           }
>>>>       }
>>>> @@ -13958,8 +13955,9 @@ 
>>>> virDomainGraphicsDefParseXMLVNC(virDomainGraphicsDefPtr def,
>>>>           }
>>>>       }
>>>> -    if (websocketGenerated && STREQ(websocketGenerated, "yes"))
>>>> -        def->data.vnc.websocketGenerated = true;
>>>> +    if (websocketGenerated &&
>>>> +        virStringParseYesNo(websocketGenerated, 
>>>> &def->data.vnc.websocketGenerated))
>>>
>>> Ooops, you've missed '< 0' comparison.
>>
>> virStringParseYesNo return 0 on succeed and -1 on error, and
>> here is && operation, so, no explicit comparison '< 0'.
> 
> The comparison is required because even though the function doesn't 
> return any positive value now it might at some point in the future. In 
> libvirt, there's the following semantics for integer return values:
> 
> < 0 : an error state,
>    0 : success,
>  > 0 : success, but also something is signalized to the caller
> 
> There's plenty of examples, but let me pick just one: The retvals for 
> virConfGetValueBool() are defined as follows:
> 
> -1 on error,
>   0 if missing,
>   1 if the value was present
> 
> And in this code you're adding, you're interested whether the function 
> failed or not. If we ever add another success value (e.g. 1), we don't 
> have to fix all the places where the function is called.

Well, very far-sighted. I got it.

Thanks for the detailed and kind reply.
Mao

> 
> Michal
> 





More information about the libvir-list mailing list