From: Stefan Hanreich <s.hanreich@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox 1/3] schema: use i64 for minimum / maximum / default integer values
Date: Wed, 29 Jan 2025 11:42:48 +0100 [thread overview]
Message-ID: <20250129104250.934927-1-s.hanreich@proxmox.com> (raw)
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
next reply other threads:[~2025-01-29 10:43 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-29 10:42 Stefan Hanreich [this message]
2025-01-29 10:42 ` [pbs-devel] [PATCH proxmox 2/3] pbs-api-types: fix values for integer schemas Stefan Hanreich
2025-01-29 10:42 ` [pbs-devel] [PATCH proxmox-backup 3/3] api: change integer schema parameters to i64 Stefan Hanreich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250129104250.934927-1-s.hanreich@proxmox.com \
--to=s.hanreich@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox