Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a36b8ce0 authored by Martin Geisler's avatar Martin Geisler
Browse files

pdl: Call conforms before attempting to parse

The ‘parse_inner’ method should only be called if the payload actually
conforms to the expected size of the packet. We might be able to make
this API prettier in the future to avoid this danger.

Tag: #feature
Bug: 274623973
Test: atest pdl_tests pdl_rust_generator_tests_{le,be}
Change-Id: I4144f50cbc7b55a97bc10ef527db654218c63173
parent 43033bb8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -626,7 +626,7 @@ impl<'a> FieldParser<'a> {
        let packet_data_child = format_ident!("{}DataChild", self.packet_name);
        self.code.push(quote! {
            let child = match (#(#constrained_field_idents),*) {
                #(#match_values => {
                #(#match_values if #child_ids_data::conforms(&payload) => {
                    let mut cell = Cell::new(payload);
                    let child_data = #child_ids_data::parse_inner(&mut cell #child_parse_args)?;
                    // TODO(mgeisler): communicate back to user if !cell.get().is_empty()?
+2 −2
Original line number Diff line number Diff line
@@ -172,12 +172,12 @@ impl FooData {
        let payload = &bytes.get()[..payload_size];
        bytes.get_mut().advance(payload_size);
        let child = match (a, b) {
            (100, _) => {
            (100, _) if BarData::conforms(&payload) => {
                let mut cell = Cell::new(payload);
                let child_data = BarData::parse_inner(&mut cell)?;
                FooDataChild::Bar(Arc::new(child_data))
            }
            (_, Enum16::B) => {
            (_, Enum16::B) if BazData::conforms(&payload) => {
                let mut cell = Cell::new(payload);
                let child_data = BazData::parse_inner(&mut cell)?;
                FooDataChild::Baz(Arc::new(child_data))
+2 −2
Original line number Diff line number Diff line
@@ -172,12 +172,12 @@ impl FooData {
        let payload = &bytes.get()[..payload_size];
        bytes.get_mut().advance(payload_size);
        let child = match (a, b) {
            (100, _) => {
            (100, _) if BarData::conforms(&payload) => {
                let mut cell = Cell::new(payload);
                let child_data = BarData::parse_inner(&mut cell)?;
                FooDataChild::Bar(Arc::new(child_data))
            }
            (_, Enum16::B) => {
            (_, Enum16::B) if BazData::conforms(&payload) => {
                let mut cell = Cell::new(payload);
                let child_data = BazData::parse_inner(&mut cell)?;
                FooDataChild::Baz(Arc::new(child_data))
+3 −3
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ impl ParentData {
        let payload = &bytes.get()[..payload_size];
        bytes.get_mut().advance(payload_size);
        let child = match (foo) {
            (Enum16::A) => {
            (Enum16::A) if ChildData::conforms(&payload) => {
                let mut cell = Cell::new(payload);
                let child_data = ChildData::parse_inner(&mut cell, bar, baz)?;
                ParentDataChild::Child(Arc::new(child_data))
@@ -360,7 +360,7 @@ impl ChildData {
        let payload = bytes.get();
        bytes.get_mut().advance(payload.len());
        let child = match (bar, quux) {
            (Enum16::A, Enum16::A) => {
            (Enum16::A, Enum16::A) if GrandChildData::conforms(&payload) => {
                let mut cell = Cell::new(payload);
                let child_data = GrandChildData::parse_inner(&mut cell, baz)?;
                ChildDataChild::GrandChild(Arc::new(child_data))
@@ -547,7 +547,7 @@ impl GrandChildData {
        let payload = bytes.get();
        bytes.get_mut().advance(payload.len());
        let child = match (baz) {
            (Enum16::A) => {
            (Enum16::A) if GrandGrandChildData::conforms(&payload) => {
                let mut cell = Cell::new(payload);
                let child_data = GrandGrandChildData::parse_inner(&mut cell)?;
                GrandChildDataChild::GrandGrandChild(Arc::new(child_data))
+3 −3
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ impl ParentData {
        let payload = &bytes.get()[..payload_size];
        bytes.get_mut().advance(payload_size);
        let child = match (foo) {
            (Enum16::A) => {
            (Enum16::A) if ChildData::conforms(&payload) => {
                let mut cell = Cell::new(payload);
                let child_data = ChildData::parse_inner(&mut cell, bar, baz)?;
                ParentDataChild::Child(Arc::new(child_data))
@@ -360,7 +360,7 @@ impl ChildData {
        let payload = bytes.get();
        bytes.get_mut().advance(payload.len());
        let child = match (bar, quux) {
            (Enum16::A, Enum16::A) => {
            (Enum16::A, Enum16::A) if GrandChildData::conforms(&payload) => {
                let mut cell = Cell::new(payload);
                let child_data = GrandChildData::parse_inner(&mut cell, baz)?;
                ChildDataChild::GrandChild(Arc::new(child_data))
@@ -547,7 +547,7 @@ impl GrandChildData {
        let payload = bytes.get();
        bytes.get_mut().advance(payload.len());
        let child = match (baz) {
            (Enum16::A) => {
            (Enum16::A) if GrandGrandChildData::conforms(&payload) => {
                let mut cell = Cell::new(payload);
                let child_data = GrandGrandChildData::parse_inner(&mut cell)?;
                GrandChildDataChild::GrandGrandChild(Arc::new(child_data))