On 2021-01-07 at 10:52, Shi Lei wrote:
On 2021-01-06 at 18:21, Michal Privoznik wrote:
>On 1/6/21 3:40 AM, Shi Lei wrote:
>> Extract common code as helper function virNetlinkTalk, then simplify
>> the functions virNetlink[DumpLink|NewLink|DelLink|GetNeighbor].
>>
>> - default:
>> - goto malformed_resp;
>> + if (resp->nlmsg_type != NLMSG_DONE) {
>> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> + _("malformed netlink response message"));
>> + return -1;
>> }
>
>This is not correct IMO. The way that control flows through this
>function before your patch is (I'm trying to create virbr0 using 'virsh
>net-start default'):
>
>1) virNetlinkCommand() suceeds,
>2) resp->nlmsg_type == NLMSG_ERROR even though the bridge was created,
>3) err->error is 0 hence we hit 'break' and fall out of the switch and ..
>
>>
>> return 0;
Yes.
So the result ((resp->nlmsg_type == NLMSG_ERROR) && (err->error == 0))
should
be regarded as a success.
I feel like that this piece of code can be like:
if (((resp->nlmsg_type != NLMSG_ERROR) || (*error != 0)) &&
(resp->nlmsg_type != NLMSG_DONE) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("malformed netlink response message"));
return -1;
}
return 0;
This piece of code can be simplified as :
if (resp->nlmsg_type != NLMSG_ERROR &&
resp->nlmsg_type != NLMSG_DONE) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("malformed netlink response message"));
return -1;
}
When we reach here, virNetlinkTalk have returned 0.
And if (resp->nlmsg_type == NLMSG_ERROR), then (*error) must be 0.
Shi Lei