rust: add overflow check in deserialize_option

To be consistent with other backends.

Bug: none
Test: aidl_integration_test
Change-Id: I415a3d98dca53cf2c0edc928e23ada3871872913
diff --git a/generate_rust.cpp b/generate_rust.cpp
index 3d8be91..3817f64 100644
--- a/generate_rust.cpp
+++ b/generate_rust.cpp
@@ -561,19 +561,22 @@
   out << "let start_pos = parcel.get_data_position();\n";
   out << "let parcelable_size: i32 = parcel.read()?;\n";
   out << "if parcelable_size < 0 { return Err(binder::StatusCode::BAD_VALUE); }\n";
+  out << "if start_pos.checked_add(parcelable_size).is_none() {\n";
+  out << "  return Err(binder::StatusCode::BAD_VALUE);\n";
+  out << "}\n";
 
-  // Pre-emit the common field prolog code, shared between all fields:
-  ostringstream prolog;
-  prolog << "if (parcel.get_data_position() - start_pos) == parcelable_size {\n";
+  // Pre-emit the common field prologue code, shared between all fields:
+  ostringstream prologue;
+  prologue << "if (parcel.get_data_position() - start_pos) == parcelable_size {\n";
   // We assume the lhs can never be > parcelable_size, because then the read
   // immediately preceding this check would have returned NOT_ENOUGH_DATA
-  prolog << "  return Ok(Some(result));\n";
-  prolog << "}\n";
-  string prolog_str = prolog.str();
+  prologue << "  return Ok(Some(result));\n";
+  prologue << "}\n";
+  string prologue_str = prologue.str();
 
   out << "let mut result = Self::default();\n";
   for (const auto& variable : parcel->GetFields()) {
-    out << prolog_str;
+    out << prologue_str;
     if (!TypeHasDefault(variable->GetType(), typenames)) {
       out << "result." << variable->GetName() << " = Some(parcel.read()?);\n";
     } else {