[PATCH v3 1/2] conf: Add <lease/> option for <dhcp/> settings

John Ferlan jferlan at redhat.com
Fri Apr 24 11:11:17 UTC 2020



On 4/22/20 4:05 PM, Julio Faracco wrote:
> If an user is trying to configure a dhcp neetwork settings, it is not
> possible to change the leasetime of a range or a host entry. This is
> available using dnsmasq extra options, but they are associated with
> dhcp-range or dhcp-hosts fields. This patch implements a leasetime for
> range and hosts tags. They can be defined under that settings:
> 
>     <dhcp>
>       <range ...>
>         <lease/>
>       </range>
>       <host ...>
>         <lease/>
>       </host>
>     </dhcp>
> 
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=913446
> 
> Signed-off-by: Julio Faracco <jcfaracco at gmail.com>
> ---

[...]

>  static int
> -virSocketAddrRangeParseXML(const char *networkName,
> -                           virNetworkIPDefPtr ipdef,
> -                           xmlNodePtr node,
> -                           virSocketAddrRangePtr range)
> +virNetworkDHCPLeaseTimeDefParseXML(virNetworkDHCPLeaseTimeDefPtr *lease,
> +                                   xmlNodePtr node)
> +{
> +    virNetworkDHCPLeaseTimeDefPtr new_lease = *lease;
> +    g_autofree char *expiry = NULL, *unit = NULL;
> +
> +    if (!(expiry = virXMLPropString(node, "expiry")))
> +        return 0;
> +
> +    if (VIR_ALLOC(new_lease) < 0)
> +        return -1;
> +
> +    if (virStrToLong_ul(expiry, NULL, 10, &new_lease->expiry) < 0)
> +        return -1;
> +
> +    if (!(unit = virXMLPropString(node, "unit")))
> +        new_lease->unit = VIR_NETWORK_DHCP_LEASETIME_UNIT_MINUTES;
> +    else
> +        new_lease->unit = virNetworkDHCPLeaseTimeUnitTypeFromString(unit);
> +
> +    /* infinite */
> +    if (new_lease->expiry > 0) {
> +        /* This boundary check is related to dnsmasq man page settings:
> +         * "The minimum lease time is two minutes." */
> +        if ((new_lease->unit == VIR_NETWORK_DHCP_LEASETIME_UNIT_SECONDS &&
> +             new_lease->expiry < 120) ||
> +            (new_lease->unit == VIR_NETWORK_DHCP_LEASETIME_UNIT_MINUTES &&
> +             new_lease->expiry < 2)) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("The minimum lease time should be greater "
> +                             "than 2 minutes"));
> +            return -1;

Coverity pointed out there's a @new_lease leak here. In just a quick
scan of the code it's not the only place and I wonder about the
initialization of new_lease = *lease and then just VIR_ALLOC right over
that... Probably should be initialized to NULL.

Anyway - perhaps consider changing @expiry to @expirystr and @unit to
@unitstr, then filling/using @expiry & @unit (instead of unitInt) for
comparisons before the VIR_ALLOC(new_lease) and filling in the two
fields once all the checks are done - probably allows those boundary
checks to not span 4 lines... JMO...

John

> +        }
> +    }
> +
> +    *lease = new_lease;
> +
> +    return 0;
> +}
> +
> +

[...]




More information about the libvir-list mailing list