From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 0B9A81FF15C for ; Fri, 22 Aug 2025 15:50:15 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 9861A1137C; Fri, 22 Aug 2025 15:50:16 +0200 (CEST) From: Stefan Hanreich To: pdm-devel@lists.proxmox.com Date: Fri, 22 Aug 2025 15:49:07 +0200 Message-ID: <20250822134942.380480-2-s.hanreich@proxmox.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250822134942.380480-1-s.hanreich@proxmox.com> References: <20250822134942.380480-1-s.hanreich@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.194 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RDNS_NONE 0.793 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [mod.rs, schema.rs, verify.rs] Subject: [pdm-devel] [PATCH proxmox v2 1/2] schema: use i64 for minimum / maximum / default integer values X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Datacenter Manager development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" IntegerSchema used isize for the minimum / maximum parameters. On 32 bit targets (wasm for instance) API defintions with minimum / maximum sizes outside the i32 range would fail. This also changes the u64 deserialize to fail if it encounters a value that cannot be represented as i64 instead of simply casting it to i64 and moving on. Signed-off-by: Stefan Hanreich --- proxmox-schema/src/de/mod.rs | 3 +-- proxmox-schema/src/de/verify.rs | 13 ++++++++----- proxmox-schema/src/schema.rs | 18 +++++++++--------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/proxmox-schema/src/de/mod.rs b/proxmox-schema/src/de/mod.rs index eca835e3..1f14503e 100644 --- a/proxmox-schema/src/de/mod.rs +++ b/proxmox-schema/src/de/mod.rs @@ -173,8 +173,7 @@ impl<'de> de::Deserializer<'de> for SchemaDeserializer<'de, '_> { .map_err(|_| Error::msg(format!("not a boolean: {:?}", self.input)))?, ), Schema::Integer(schema) => { - // FIXME: isize vs explicit i64, needs fixing in schema check_constraints api - let value: isize = self + let value: i64 = self .input .parse() .map_err(|_| Error::msg(format!("not an integer: {:?}", self.input)))?; diff --git a/proxmox-schema/src/de/verify.rs b/proxmox-schema/src/de/verify.rs index 67a8c9e8..917f956b 100644 --- a/proxmox-schema/src/de/verify.rs +++ b/proxmox-schema/src/de/verify.rs @@ -170,7 +170,7 @@ impl<'de> de::Visitor<'de> for Visitor { fn visit_i64(self, v: i64) -> Result { match self.0 { - Schema::Integer(schema) => match schema.check_constraints(v as isize) { + Schema::Integer(schema) => match schema.check_constraints(v) { Ok(()) => Ok(Verifier), Err(err) => Err(E::custom(err)), }, @@ -180,10 +180,13 @@ impl<'de> de::Visitor<'de> for Visitor { fn visit_u64(self, v: u64) -> Result { match self.0 { - Schema::Integer(schema) => match schema.check_constraints(v as isize) { - Ok(()) => Ok(Verifier), - Err(err) => Err(E::custom(err)), - }, + Schema::Integer(schema) => { + let val = v.try_into().or_else(|err| Err(E::custom(err)))?; + match schema.check_constraints(val) { + Ok(()) => Ok(Verifier), + Err(err) => Err(E::custom(err)), + } + } _ => Err(E::invalid_type(Unexpected::Unsigned(v), &self)), } } diff --git a/proxmox-schema/src/schema.rs b/proxmox-schema/src/schema.rs index ddbbacd4..8a99909f 100644 --- a/proxmox-schema/src/schema.rs +++ b/proxmox-schema/src/schema.rs @@ -228,11 +228,11 @@ impl BooleanSchema { pub struct IntegerSchema { pub description: &'static str, /// Optional minimum. - pub minimum: Option, + pub minimum: Option, /// Optional maximum. - pub maximum: Option, + pub maximum: Option, /// Optional default. - pub default: Option, + pub default: Option, } impl IntegerSchema { @@ -250,17 +250,17 @@ impl IntegerSchema { self } - pub const fn default(mut self, default: isize) -> Self { + pub const fn default(mut self, default: i64) -> Self { self.default = Some(default); self } - pub const fn minimum(mut self, minimum: isize) -> Self { + pub const fn minimum(mut self, minimum: i64) -> Self { self.minimum = Some(minimum); self } - pub const fn maximum(mut self, maximum: isize) -> Self { + pub const fn maximum(mut self, maximum: i64) -> Self { self.maximum = Some(maximum); self } @@ -269,7 +269,7 @@ impl IntegerSchema { Schema::Integer(self) } - pub fn check_constraints(&self, value: isize) -> Result<(), Error> { + pub fn check_constraints(&self, value: i64) -> Result<(), Error> { if let Some(minimum) = self.minimum { if value < minimum { bail!( @@ -296,7 +296,7 @@ impl IntegerSchema { /// Verify JSON value using an `IntegerSchema`. pub fn verify_json(&self, data: &Value) -> Result<(), Error> { if let Some(value) = data.as_i64() { - self.check_constraints(value as isize) + self.check_constraints(value) } else { bail!("Expected integer value."); } @@ -1406,7 +1406,7 @@ impl Schema { Value::Bool(res) } Schema::Integer(integer_schema) => { - let res: isize = value_str.parse()?; + let res: i64 = value_str.parse()?; integer_schema.check_constraints(res)?; Value::Number(res.into()) } -- 2.47.2 _______________________________________________ pdm-devel mailing list pdm-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel