Skip to content

Commit

Permalink
Merge pull request #180 from sval-rs/fix/buffer-panic
Browse files Browse the repository at this point in the history
Fix a panic attempting to buffer an invalid value
  • Loading branch information
KodrAus authored Oct 18, 2023
2 parents 2c2fcde + 429e708 commit 8bfb3dc
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
27 changes: 25 additions & 2 deletions buffer/src/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ impl<'sval> ValueBuf<'sval> {

match v.stream(&mut buf) {
Ok(()) => Ok(buf),
Err(_) => Err(buf.err.unwrap()),
Err(_) => Err(buf.into_err()),
}
}

Expand Down Expand Up @@ -201,6 +201,11 @@ impl<'sval> ValueBuf<'sval> {
self.err = Some(err);
sval::error()
}

fn into_err(self) -> Error {
self.err
.unwrap_or_else(|| Error::invalid_value("the value itself failed to stream"))
}
}

impl ValueBuf<'static> {
Expand All @@ -216,7 +221,7 @@ impl ValueBuf<'static> {
// have to be converted into owned anyways
match sval::stream_computed(&mut buf, v) {
Ok(()) => Ok(buf),
Err(_) => Err(buf.err.unwrap()),
Err(_) => Err(buf.into_err()),
}
}
}
Expand Down Expand Up @@ -2283,6 +2288,24 @@ mod alloc_support {
assert_eq!(Value::collect(&true).unwrap().parts, buf.to_value().parts);
}

#[test]
fn buffer_invalid() {
struct Kaboom;

impl sval::Value for Kaboom {
fn stream<'sval, S: sval::Stream<'sval> + ?Sized>(
&'sval self,
_: &mut S,
) -> sval::Result {
sval::error()
}
}

// Ensure we don't panic
let _ = Value::collect(&Kaboom);
let _ = Value::collect_owned(&Kaboom);
}

#[test]
fn into_owned() {
let short_lived = String::from("abc");
Expand Down
7 changes: 6 additions & 1 deletion json/bench/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,12 @@ fn twitter_sval_collect(b: &mut test::Bencher) {
#[bench]
fn twitter_sval_collect_owned(b: &mut test::Bencher) {
let s = input_struct();
b.iter(|| sval_buffer::Value::collect(&s).unwrap().into_owned().unwrap());
b.iter(|| {
sval_buffer::Value::collect(&s)
.unwrap()
.into_owned()
.unwrap()
});
}

#[bench]
Expand Down

0 comments on commit 8bfb3dc

Please sign in to comment.