[libvirt] [PATCH] fix crash when starting network

Wen Congyang wencongyang at gmail.com
Wed Nov 2 14:25:40 UTC 2011


On 11/02/2011 07:16 PM, Stefan Berger wrote:
> On 11/02/2011 01:17 AM, Wen Congyang wrote:
>> commit 27908453 introduces a regression, and it will
>> cause libvirt crashed when starting network.
>>
>> The reason is that tapfd may be NULL, but we dereference
>> it without checking whether it is NULL.
>>
>> ---
>> src/util/bridge.c | 18 ++++++++++--------
>> 1 files changed, 10 insertions(+), 8 deletions(-)
>>
>> diff --git a/src/util/bridge.c b/src/util/bridge.c
>> index 952f0f3..6774f99 100644
>> --- a/src/util/bridge.c
>> +++ b/src/util/bridge.c
>> @@ -484,7 +484,8 @@ brAddTap(brControl *ctl,
>>
>> errno = brCreateTap(ctl, ifname, vnet_hdr, tapfd);
>>
>> - if (*tapfd< 0 || errno)
>> + /* fd has been closed in brCreateTap() when it failed. */
>> + if (errno)
>> goto error;
>>
>> /* We need to set the interface MAC before adding it
>> @@ -494,22 +495,23 @@ brAddTap(brControl *ctl,
>> * device before we set our static MAC.
>> */
>> if ((errno = brSetInterfaceMac(ctl, *ifname, macaddr)))
>> - goto error;
>> + goto close_fd;
>> /* We need to set the interface MTU before adding it
>> * to the bridge, because the bridge will have its
>> * MTU adjusted automatically when we add the new interface.
>> */
>> if ((errno = brSetInterfaceMtu(ctl, bridge, *ifname)))
>> - goto error;
>> + goto close_fd;
>> if ((errno = brAddInterface(ctl, bridge, *ifname)))
>> - goto error;
>> + goto close_fd;
>> if (up&& ((errno = brSetInterfaceUp(ctl, *ifname, 1))))
>> - goto error;
>> + goto close_fd;
>> return 0;
>>
>> - error:
>> - VIR_FORCE_CLOSE(*tapfd);
>> -
>> +close_fd:
>> + if (tapfd)
>> + VIR_FORCE_CLOSE(*tapfd);
> It's not necessary to test for tapfd. This is similar to VIR_FREE().
> Besides that you should test for if(tapfd>=0) if testing at all.

Without this check, libvirt may crash. tapfd is pointer, and it is not
necessary to check if *tapfd >= 0, but it is necessary to test for tapfd.

So I pushed this patch without any change.

Thanks
Wen Congyang

>
> Stefan
>> +error:
>> return errno;
>> }
>>
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
>




More information about the libvir-list mailing list