[pve-devel] [PATCH guest-common 1/5] guesthelpers: move/add safe comparison functions from lxc and qemu

Stefan Reiter s.reiter at proxmox.com
Thu Feb 13 11:16:31 CET 2020


On 1/28/20 4:03 PM, Oguz Bektas wrote:
> move the safe_string_ne and safe_num_ne functions to guesthelpers to
> remove duplicate code.
> 
> add the new safe_boolean_ne and typesafe_ne helper functions
> 
> Signed-off-by: Oguz Bektas <o.bektas at proxmox.com>
> ---
> 
> these will be used in the partial fast plug function in this series
> 
>   PVE/GuestHelpers.pm | 49 +++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 49 insertions(+)
> 
> diff --git a/PVE/GuestHelpers.pm b/PVE/GuestHelpers.pm
> index 07a62ce..b7133d0 100644
> --- a/PVE/GuestHelpers.pm
> +++ b/PVE/GuestHelpers.pm
> @@ -14,6 +14,55 @@ use Scalar::Util qw(weaken);
>   
>   our $lockdir = '/var/lock/pve-manager';
>   
> +# safe variable comparison functions
> +
> +sub safe_num_ne {
> +    my ($a, $b) = @_;
> +
> +    return 0 if !defined($a) && !defined($b);
> +    return 1 if !defined($a);
> +    return 1 if !defined($b);
> +
> +    return $a != $b;
> +}
> +
> +sub safe_string_ne  {
> +    my ($a, $b) = @_;
> +
> +    return 0 if !defined($a) && !defined($b);
> +    return 1 if !defined($a);
> +    return 1 if !defined($b);
> +
> +    return $a ne $b;
> +}
> +
> +sub safe_boolean_ne {
> +    my ($a, $b) = @_;
> +
> +    # we don't check if value is defined, since undefined
> +    # is false (so it's a valid boolean)
> +
> +    # negate both values to normalize and compare
> +    return !$a != !$b;
> +}
> +
> +sub typesafe_ne {
> +    my ($a, $b, $type) = @_;
> +
> +    return 0 if !defined($a) && !defined($b);
> +    return 1 if !defined($a);
> +    return 1 if !defined($b);
> +
> +    if ($type eq 'string') {
> +	return safe_string_ne($a, $b);
> +    } elsif ($type eq 'number') {

This should include 'integer' too, since it's pretty much just a limited 
'number'.

> +	return safe_num_ne($a, $b);
> +    } elsif ($type eq 'boolean') {
> +	return safe_boolean_ne($a, $b);
> +    }

I'd add a 'die "internal error bla bla ..."' part just to be safe. 
Otherwise you just end the function without a return if $type is not 
matched, and I don't trust Perl to do the right thing™ in that case at all.

> +}
> +
> +
>   sub guest_migration_lock {
>       my ($vmid, $timeout, $func, @param) = @_;
>   
> 



More information about the pve-devel mailing list