Skip to content

Commit f9870cd

Browse files
authored
Merge pull request #1419 from zeenix/fix-zv-regression
🚑️ zv: Check signature before serializing struct as a u8
2 parents c76923f + efefde9 commit f9870cd

File tree

3 files changed

+10
-10
lines changed

3 files changed

+10
-10
lines changed

zvariant/src/dbus/ser.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -326,22 +326,19 @@ where
326326
}
327327

328328
fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
329-
if len == 0 {
330-
return StructSerializer::unit(self).map(StructSeqSerializer::Struct);
331-
}
332-
333329
self.0
334330
.add_padding(self.0.signature.alignment(self.0.ctxt.format()))?;
335331
match &self.0.signature {
336332
Signature::Variant => StructSerializer::variant(self).map(StructSeqSerializer::Struct),
337333
Signature::Array(_) => self.serialize_seq(Some(len)).map(StructSeqSerializer::Seq),
334+
Signature::U8 => StructSerializer::unit(self).map(StructSeqSerializer::Struct),
338335
Signature::Structure(_) => {
339336
StructSerializer::structure(self).map(StructSeqSerializer::Struct)
340337
}
341338
Signature::Dict { .. } => self.serialize_map(Some(len)).map(StructSeqSerializer::Map),
342339
_ => Err(Error::SignatureMismatch(
343340
self.0.signature.clone(),
344-
"a struct, array or variant".to_string(),
341+
"a struct, array, u8 or variant".to_string(),
345342
)),
346343
}
347344
}

zvariant/src/gvariant/ser.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -327,23 +327,20 @@ where
327327
}
328328

329329
fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
330-
if len == 0 {
331-
return StructSerializer::unit(self).map(StructSeqSerializer::Struct);
332-
}
333-
334330
self.0
335331
.add_padding(self.0.signature.alignment(self.0.ctxt.format()))?;
336332
match &self.0.signature {
337333
Signature::Variant => StructSerializer::variant(self).map(StructSeqSerializer::Struct),
338334
Signature::Array(_) => self.serialize_seq(Some(len)).map(StructSeqSerializer::Seq),
335+
Signature::U8 => StructSerializer::unit(self).map(StructSeqSerializer::Struct),
339336
Signature::Structure(_) => {
340337
StructSerializer::structure(self).map(StructSeqSerializer::Struct)
341338
}
342339
Signature::Dict { .. } => self.serialize_map(Some(len)).map(StructSeqSerializer::Map),
343340
_ => {
344341
return Err(Error::SignatureMismatch(
345342
self.0.signature.clone(),
346-
"a struct, array or variant".to_string(),
343+
"a struct, array, u8 or variant".to_string(),
347344
));
348345
}
349346
}

zvariant/tests/dict_value.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,4 +235,10 @@ fn dict_value() {
235235
#[derive(Default, Debug, SerializeDict, DeserializeDict, Type)]
236236
#[zvariant(signature = "dict")]
237237
struct TestEmpty {}
238+
239+
// Empty dict should be serialized to contain 4 bytes for the ARRAY length and 4 bytes for the
240+
// DICT_ENTRY alignment to 8 bytes boundary.
241+
let data = to_bytes(ctxt, &TestEmpty::default()).unwrap();
242+
243+
assert_eq!(data.bytes(), &[0, 0, 0, 0, 0, 0, 0, 0]);
238244
}

0 commit comments

Comments
 (0)