[pve-devel] [PATCH pve-common] cli: fix #6762: only copy properties if defined
Nicolas Frey
n.frey at proxmox.com
Tue Oct 7 17:13:38 CEST 2025
On 10/7/25 4:46 PM, Thomas Lamprecht wrote:
> Am 07.10.25 um 15:56 schrieb Nicolas Frey:
>> Adds a defined check to the copy, as to not result in the bugfixes
>> reported error when double tabbing on `pveceph status`.
> Feel encouraged to include errors in verbatim in commit message,
> while we own bugzilla.proxmox.com and thus it's unlikely that it
> will be gone without notice or migration it's still always nice to
> keep git commits self-sufficient w.r.t core information. Makes it
> also easier to find a commit if one just searches for the error
> message.
>
OK, will do in the future. Thanks for letting me know!
>>
>> Fixes: https://bugzilla.proxmox.com/show_bug.cgi?id=6762
>> Signed-off-by: Nicolas Frey <n.frey at proxmox.com>
>> ---
>> src/PVE/CLIHandler.pm | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/PVE/CLIHandler.pm b/src/PVE/CLIHandler.pm
>> index 89cb7b7..cdd71c7 100644
>> --- a/src/PVE/CLIHandler.pm
>> +++ b/src/PVE/CLIHandler.pm
>> @@ -455,7 +455,8 @@ my $print_bash_completion = sub {
>>
>> my $info = $class->map_method_by_name($name);
>>
>> - my $prop = { %{ $info->{parameters}->{properties} } }; # copy
>> + my $prop = { %{ $info->{parameters}->{properties} } }
>> + if defined $info->{parameters}->{properties}; # copy
>
> You cannot know without having lots of perl experience, or having had
> the bad luck of debugging this yourself early on, but a conditional
> declaration of a variable is Real Bad™ perl, as it will retain the
> value of the last time the condition held true for the case it's false
> now.
>
TIL another weird quirk about perl. Thanks for pointing it out and
saving me from needing to debug this!
Will send a v2 momentarily.
> See the NOTE at the end of the "Statement Modifiers" [0] section for
> details.
>
> [0]: https://perldoc.perl.org/perlsyn#Statement-Modifiers
>
> Safe alternatives are:
>
> my $prop;
> $prop = { $info->{parameters}->{properties}->%* } if defined($info->{parameters}->{properties});
>
> Similar, but with normal if block, which can be combined with adding a
> intermediate variable.
>
> my $prop;
> if (defined(my $properties = $info->{parameters}->{properties})) {
> $prop = { $properties->%* }; # clone
> }
>
> Alternatively, one can use a intermediate variable + a fallback value
>
> my $parameter_properties = $info->{parameters}->{properties} // {};
> my $prop = { $parameter_properties->%* }; # copy
>
> Alternatively, one can use a ternary statement:
>
> $prop = defined($info->{parameters}->{properties})
> ? { $info->{parameters}->{properties}->%* }
> : {};
>
> The last one is IMO a bit long here.
>
>
>> $prop = { %$prop, %$formatter_properties } if $formatter_properties;
>>
>> my $print_parameter_completion = sub {
>
More information about the pve-devel
mailing list