Skip to content

Commit c082d46

Browse files
authored
Merge pull request #15 from spyoungtech/fix-multibyte-char-after-value
Fix multibyte char after value
2 parents e4333c1 + d2e0837 commit c082d46

File tree

6 files changed

+229
-2
lines changed

6 files changed

+229
-2
lines changed

fuzz/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
target
2+
corpus
3+
artifacts
4+
coverage

fuzz/Cargo.lock

Lines changed: 177 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fuzz/Cargo.toml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
[package]
2+
name = "json-five-fuzz"
3+
version = "0.0.0"
4+
publish = false
5+
edition = "2024"
6+
7+
[package.metadata]
8+
cargo-fuzz = true
9+
10+
[dependencies]
11+
libfuzzer-sys = "0.4"
12+
13+
[dependencies.json-five]
14+
path = ".."
15+
16+
[[bin]]
17+
name = "fuzz_target_1"
18+
path = "fuzz_targets/fuzz_target_1.rs"
19+
test = false
20+
doc = false
21+
bench = false

fuzz/fuzz_targets/fuzz_target_1.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#![no_main]
2+
3+
use libfuzzer_sys::fuzz_target;
4+
use json_five::tokenize::tokenize_bytes;
5+
use json_five::parser::from_tokens;
6+
fuzz_target!(|data: &[u8]| {
7+
let result = tokenize_bytes(data);
8+
if let Ok(tokens) = result {
9+
let _ = from_tokens(&tokens);
10+
}
11+
});

src/parser.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ impl<'toks, 'input> JSON5Parser<'toks, 'input> {
538538
None => {}
539539
Some(span) => {
540540
if span.1 != TokType::EOF {
541-
return Err(self.make_error(format!("Unexpected {:?} token after value", span.1), span.0 - 1))
541+
return Err(self.make_error(format!("Unexpected {:?} token after value", span.1), span.0))
542542
}
543543
}
544544
}
@@ -600,6 +600,12 @@ mod tests {
600600
use crate::parser::JSONValue::*;
601601
use super::*;
602602

603+
#[test]
604+
fn test_fuzz_1() {
605+
let res = from_str("0xA18 {9");
606+
assert!(res.is_err());
607+
}
608+
603609
#[test]
604610
fn test_from_bytes() {
605611
let res = from_bytes(b"{}").unwrap();

src/rt/parser.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,7 @@ impl<'toks, 'input> JSON5Parser<'toks, 'input> {
656656
None => {}
657657
Some(span) => {
658658
if span.1 != TokType::EOF {
659-
return Err(self.make_error(format!("Unexpected {:?} token after value", span.1), span.0 - 1))
659+
return Err(self.make_error(format!("Unexpected {:?} token after value", span.1), span.0))
660660
}
661661
}
662662
}
@@ -704,7 +704,15 @@ pub fn from_str(source: &str) -> Result<JSONText, ParsingError> {
704704
#[cfg(test)]
705705
mod tests {
706706
use crate::tokenize::Tokenizer;
707+
707708
use super::*;
709+
710+
#[test]
711+
fn test_fuzz_1() {
712+
let res = from_str("0xA18 {9");
713+
assert!(res.is_err());
714+
}
715+
708716
#[test]
709717
fn test_foo() {
710718
let res = from_str("{}").unwrap();

0 commit comments

Comments
 (0)