From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pbs-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 5B4361FF165 for <inbox@lore.proxmox.com>; Wed, 29 Jan 2025 11:43:25 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 76BB91F987; Wed, 29 Jan 2025 11:43:23 +0100 (CET) From: Stefan Hanreich <s.hanreich@proxmox.com> To: pbs-devel@lists.proxmox.com Date: Wed, 29 Jan 2025 11:42:48 +0100 Message-Id: <20250129104250.934927-1-s.hanreich@proxmox.com> X-Mailer: git-send-email 2.39.5 MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.240 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: [pbs-devel] [PATCH proxmox 1/3] schema: use i64 for minimum / maximum / default integer values X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion <pbs-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pbs-devel>, <mailto:pbs-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pbs-devel/> List-Post: <mailto:pbs-devel@lists.proxmox.com> List-Help: <mailto:pbs-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel>, <mailto:pbs-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox Backup Server development discussion <pbs-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" <pbs-devel-bounces@lists.proxmox.com> 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 <s.hanreich@proxmox.com> --- 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<E: de::Error>(self, v: i64) -> Result<Self::Value, E> { 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<E: de::Error>(self, v: u64) -> Result<Self::Value, E> { 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 3448112b..3090da09 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<isize>, + pub minimum: Option<i64>, /// Optional maximum. - pub maximum: Option<isize>, + pub maximum: Option<i64>, /// Optional default. - pub default: Option<isize>, + pub default: Option<i64>, } 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."); } @@ -1235,7 +1235,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.39.5 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel