Skip to content

Commit 6764f50

Browse files
author
Elad Yosifon
committed
fix #226: Index-Out-Of-Bounds panic when using #[serde(skip_serializing_if = "Option::is_none")]
1 parent d8bc430 commit 6764f50

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

avro/src/ser_schema.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,11 @@ impl<W: Write> ser::SerializeStruct for SchemaAwareWriteSerializeStruct<'_, '_,
384384
}
385385
}
386386

387+
fn skip_field(&mut self, _key: &'static str) -> Result<(), Self::Error> {
388+
self.item_count += 1;
389+
Ok(())
390+
}
391+
387392
fn end(self) -> Result<Self::Ok, Self::Error> {
388393
self.end()
389394
}

avro/tests/avro-rs-226.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
use apache_avro::{AvroSchema, Writer};
2+
use apache_avro_test_helper::TestResult;
3+
use serde::Serialize;
4+
5+
#[test]
6+
fn avro_rs_225_index_out_of_bounds_with_serde_skip_serializing_skip_middle_field() -> TestResult {
7+
#[derive(Serialize, AvroSchema)]
8+
struct T {
9+
x: Option<i8>,
10+
#[serde(skip_serializing_if = "Option::is_none")]
11+
y: Option<String>,
12+
z: Option<i8>,
13+
}
14+
15+
let schema = T::get_schema();
16+
let mut writer = Writer::new(&schema, vec![]);
17+
writer.append_ser(T {
18+
x: None,
19+
y: None,
20+
z: Some(1),
21+
})?;
22+
writer.into_inner()?;
23+
Ok(())
24+
}
25+
26+
#[test]
27+
fn avro_rs_225_index_out_of_bounds_with_serde_skip_serializing_skip_first_field() -> TestResult {
28+
#[derive(Serialize, AvroSchema)]
29+
struct T {
30+
#[serde(skip_serializing_if = "Option::is_none")]
31+
x: Option<i8>,
32+
y: Option<String>,
33+
z: Option<i8>,
34+
}
35+
36+
let schema = T::get_schema();
37+
let mut writer = Writer::new(&schema, vec![]);
38+
writer.append_ser(T {
39+
x: None,
40+
y: None,
41+
z: Some(1),
42+
})?;
43+
writer.into_inner()?;
44+
Ok(())
45+
}
46+
47+
#[test]
48+
fn avro_rs_225_index_out_of_bounds_with_serde_skip_serializing_skip_last_field() -> TestResult {
49+
#[derive(Serialize, AvroSchema)]
50+
struct T {
51+
x: Option<i8>,
52+
y: Option<String>,
53+
#[serde(skip_serializing_if = "Option::is_none")]
54+
z: Option<i8>,
55+
}
56+
57+
let schema = T::get_schema();
58+
let mut writer = Writer::new(&schema, vec![]);
59+
writer.append_ser(T {
60+
x: Some(0),
61+
y: None,
62+
z: None,
63+
})?;
64+
writer.into_inner()?;
65+
Ok(())
66+
}
67+
68+
#[test]
69+
fn avro_rs_225_index_out_of_bounds_with_serde_skip_serializing_skip_multiple_fields() -> TestResult
70+
{
71+
#[derive(Serialize, AvroSchema)]
72+
struct T {
73+
x: Option<i8>,
74+
#[serde(skip_serializing_if = "Option::is_none")]
75+
y: Option<String>,
76+
#[serde(skip_serializing_if = "Option::is_none")]
77+
z: Option<i8>,
78+
}
79+
80+
let schema = T::get_schema();
81+
let mut writer = Writer::new(&schema, vec![]);
82+
writer.append_ser(T {
83+
x: Some(0),
84+
y: None,
85+
z: None,
86+
})?;
87+
writer.into_inner()?;
88+
Ok(())
89+
}

0 commit comments

Comments
 (0)