From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id 99EE61FF0AE for ; Tue, 01 Sep 2026 17:32:15 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id DF09B20312; Tue, 01 Sep 2026 17:32:14 +0200 (CEST) Date: Tue, 1 Sep 2026 17:32:04 +0200 From: Wolfgang Bumiller To: Arthur Bied-Charreton Subject: Re: [PATCH pve-manager] fix #7942: pvesh: treat schema without properties as empty object Message-ID: References: <20260819095023.329117-1-a.bied-charreton@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20260819095023.329117-1-a.bied-charreton@proxmox.com> X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1788276721920 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.794 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) POISEN_SPAM_PILL 0.1 Meta: its spam POISEN_SPAM_PILL_1 0.1 random spam to be learned in bayes POISEN_SPAM_PILL_3 0.1 random spam to be learned in bayes RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: RJUOJGYCFFNSPNVDMCR4R7ORMPRXC67O X-Message-ID-Hash: RJUOJGYCFFNSPNVDMCR4R7ORMPRXC67O X-MailFrom: w.bumiller@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: pve-devel@lists.proxmox.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On Wed, Aug 19, 2026 at 11:50:23AM +0200, Arthur Bied-Charreton wrote: > merge_properties() dispatches on the shape of the target schema by > merging into `properties` if present, appending to an `allOf` list, or > wrapping a `oneOf` into a new `allOf`. A schema with none of those > entries died on the assumption that it is not an object. > > A lot of endpoints (e.g., /cluster/firewall/options, > /cluster/notifications/matcher-field-values) across our api define the > parameters schema as follows: > > { additionalProperties => 0 } > > Before 874d160f317a, pvesh treated this as a valid schema allowing no > parameters. Since that commit, it fails while loading with the > following error: > > unknown schema type (not an object?) > > Split the fallback branch into the three cases that can reach it: die > with the offending type if the schema is explicitly not an object, die > with the offending keys if it contains unexpected keys, otherwise treat > `$to` as a valid, empty object and populate `properties` directly. > > Fixes: 874d160f317a ("pvesh: support for allOf/oneOf parameter schemas") > Fixes: https://bugzilla.proxmox.com/show_bug.cgi?id=7942 > Signed-off-by: Arthur Bied-Charreton > --- > PVE/CLI/pvesh.pm | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/PVE/CLI/pvesh.pm b/PVE/CLI/pvesh.pm > index 0ff481d4..9568e22b 100755 > --- a/PVE/CLI/pvesh.pm > +++ b/PVE/CLI/pvesh.pm > @@ -304,6 +304,12 @@ my $our_properties = { > }, > }; > > +my sub unknown_schema_keys { > + my ($schema) = @_; > + > + return [grep { $_ ne 'additionalProperties' && $_ ne 'type' } keys $schema->%*]; > +} This does not need to be its own sub. > + > my sub merge_properties { > my ($from, $to) = @_; > > @@ -323,7 +329,14 @@ my sub merge_properties { > my $old = { $to->%* }; > $to->%* = (allOf => [$old, $from]); > } else { > - die "unknown schema type (not an object?)\n"; > + die "unknown schema type '$to->{type}' (not an object)\n" > + if defined($to->{type}) && $to->{type} ne 'object'; > + > + my $unknown = unknown_schema_keys($to); > + die "unknown schema type, found unexpected keys: " . join(', ', sort($unknown->@*)) . "\n" > + if $unknown->@*; I'm not convinced a list like this is the best way to go here, but it also won't hurt I suppose. Either way - please just inline the helper sub, it's a quite specific part of this check and message. > + > + $to->{properties} = { $from->{properties}->%* }; > } > } > > -- > 2.47.3