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

Commit aa546de6 authored by Martin Geisler's avatar Martin Geisler Committed by Cherrypicker Worker
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}
(cherry picked from https://android-review.googlesource.com/q/commit:a36b8ce03646fc9a4fc798beb5e893554890183f)
Merged-In: I4144f50cbc7b55a97bc10ef527db654218c63173
Change-Id: I4144f50cbc7b55a97bc10ef527db654218c63173
parent e37dfe0e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -625,7 +625,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))