~tdeo/serde_bare

This thread contains a patchset. You're looking at the original emails, but you may wish to use the patch review UI. Review patch
1

[PATCH v2] Do not accept sequences with no length information

Details
Message ID
<20210317091934.16144-1-enrico.lumetti@gmail.com>
DKIM signature
missing
Download raw message
Patch: +26 -5
---
 src/error.rs |  2 ++
 src/ser.rs   | 29 ++++++++++++++++++++++++-----
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/error.rs b/src/error.rs
index a89c41c..28937cc 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -16,6 +16,7 @@ pub enum Error {
    InvalidUtf8,
    InvalidChar,

    SequenceLengthRequired,
    MapLengthRequired,
}

@@ -39,6 +40,7 @@ impl Display for Error {
            Error::AnyUnsupported => formatter.write_str("BARE does not support any"),
            Error::InvalidUtf8 => formatter.write_str("invalid utf-8 in string"),
            Error::InvalidChar => formatter.write_str("invalid unicode codepoint in char"),
            Error::SequenceLengthRequired => formatter.write_str("sequence length required"),
            Error::MapLengthRequired => formatter.write_str("map length required"),
        }
    }
diff --git a/src/ser.rs b/src/ser.rs
index 1cb1449..88a9d3c 100644
--- a/src/ser.rs
+++ b/src/ser.rs
@@ -176,12 +176,11 @@ where
        value.serialize(self)
    }

    /// BARE type if len is None: []type
    /// BARE type if len is Some: \[len\]type
    /// BARE type if len is Some: []type
    /// BARE type \[len\]type is never used for variable-length sequences
    /// Error::SequenceLengthRequired if len is None
    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
        if let Some(len) = len {
            Uint(len as u64).serialize(&mut *self)?;
        }
        Uint(len.ok_or(Error::SequenceLengthRequired)? as u64).serialize(&mut *self)?;
        Ok(self)
    }

@@ -415,3 +414,23 @@ where
    value.serialize(&mut serializer)?;
    Ok(())
}

#[cfg(test)]
mod test {
    #[test]
    fn test_unbounded_sequence() {
        use serde::Serializer;
        let seq = [1, 2, 3];
        let vec = Vec::<u8>::new();
        let mut serializer = super::Serializer::new(vec);
        assert!(serializer
            .collect_seq(seq.iter().filter_map(|x| {
                if x % 2 == 0 {
                    Some(x)
                } else {
                    None
                }
            }))
            .is_err());
    }
}
-- 
2.27.0
Details
Message ID
<CALYS598FR1P.WJWN1MH3QOU3@mikochi>
In-Reply-To
<20210317091934.16144-1-enrico.lumetti@gmail.com> (view parent)
DKIM signature
missing
Download raw message
On Wed Mar 17, 2021 at 3:19 AM MDT, Enrico Lumetti wrote:
> ---
> src/error.rs | 2 ++
> src/ser.rs | 29 ++++++++++++++++++++++++-----
> 2 files changed, 26 insertions(+), 5 deletions(-)
>
> diff --git a/src/error.rs b/src/error.rs
> index a89c41c..28937cc 100644
> --- a/src/error.rs
> +++ b/src/error.rs
> @@ -16,6 +16,7 @@ pub enum Error {
> InvalidUtf8,
> InvalidChar,
>  
> + SequenceLengthRequired,
> MapLengthRequired,
> }
>  
> @@ -39,6 +40,7 @@ impl Display for Error {
> Error::AnyUnsupported => formatter.write_str("BARE does not support
> any"),
> Error::InvalidUtf8 => formatter.write_str("invalid utf-8 in string"),
> Error::InvalidChar => formatter.write_str("invalid unicode codepoint in
> char"),
> + Error::SequenceLengthRequired => formatter.write_str("sequence length
> required"),
> Error::MapLengthRequired => formatter.write_str("map length required"),
> }
> }
> diff --git a/src/ser.rs b/src/ser.rs
> index 1cb1449..88a9d3c 100644
> --- a/src/ser.rs
> +++ b/src/ser.rs
> @@ -176,12 +176,11 @@ where
> value.serialize(self)
> }
>  
> - /// BARE type if len is None: []type
> - /// BARE type if len is Some: \[len\]type
> + /// BARE type if len is Some: []type
> + /// BARE type \[len\]type is never used for variable-length sequences
> + /// Error::SequenceLengthRequired if len is None
> fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq,
> Self::Error> {
> - if let Some(len) = len {
> - Uint(len as u64).serialize(&mut *self)?;
> - }
> + Uint(len.ok_or(Error::SequenceLengthRequired)? as u64).serialize(&mut
> *self)?;
> Ok(self)
> }
>  
> @@ -415,3 +414,23 @@ where
> value.serialize(&mut serializer)?;
> Ok(())
> }
> +
> +#[cfg(test)]
> +mod test {
> + #[test]
> + fn test_unbounded_sequence() {
> + use serde::Serializer;
> + let seq = [1, 2, 3];
> + let vec = Vec::<u8>::new();
> + let mut serializer = super::Serializer::new(vec);
> + assert!(serializer
> + .collect_seq(seq.iter().filter_map(|x| {
> + if x % 2 == 0 {
> + Some(x)
> + } else {
> + None
> + }
> + }))
> + .is_err());
> + }
> +}
> --
> 2.27.0

Thanks! Applied and released as 0.4.0.
Reply to thread Export thread (mbox)