summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChih-Yu Huang <akahuang@google.com>2022-03-29 11:01:20 +0900
committerChih-Yu Huang <akahuang@google.com>2022-03-29 13:07:05 +0900
commit6f5d9d1a91eab166cdbf1ed6ca565e100e495989 (patch)
treefa2da7b3febd85e6dfc9ae642e6419ba207eea77 /src
parentb8bbeddf8cb78821eaaaf5a63f6b3ba1608b62db (diff)
downloaduwb-6f5d9d1a91eab166cdbf1ed6ca565e100e495989.tar.gz
event_manager: avoid expect() when failed to convert data
expect() would crash the process in failed case. This CL avoids using expect(), and return Error::JniCall(JniError::Unknown) gracefully. Bug: 227263938 Test: mmm external/uwb Change-Id: I846eaa6a694af501561797b5401f5ac3f9f5991b
Diffstat (limited to 'src')
-rw-r--r--src/rust/event_manager/mod.rs421
1 files changed, 215 insertions, 206 deletions
diff --git a/src/rust/event_manager/mod.rs b/src/rust/event_manager/mod.rs
index 34e79b1..f3abd7b 100644
--- a/src/rust/event_manager/mod.rs
+++ b/src/rust/event_manager/mod.rs
@@ -179,8 +179,10 @@ impl EventManagerImpl {
env: &JNIEnv,
data: DeviceStatusNtfPacket,
) -> Result<()> {
- let state =
- data.get_device_state().to_i32().expect("Failed converting device_state to i32");
+ let state = data.get_device_state().to_i32().ok_or_else(|| {
+ error!("Failed converting device_state to i32");
+ Error::JniCall(JniError::Unknown)
+ })?;
env.call_method(
self.obj.as_obj(),
"onDeviceStatusNotificationReceived",
@@ -195,12 +197,18 @@ impl EventManagerImpl {
env: &JNIEnv,
data: SessionStatusNtfPacket,
) -> Result<()> {
- let session_id =
- data.get_session_id().to_i64().expect("Failed converting session_id to i64");
- let state =
- data.get_session_state().to_i32().expect("Failed converting session_state to i32");
- let reason_code =
- data.get_reason_code().to_i32().expect("Failed converting reason_code to i32");
+ let session_id = data.get_session_id().to_i64().ok_or_else(|| {
+ error!("Failed converting session_id to i64");
+ Error::JniCall(JniError::Unknown)
+ })?;
+ let state = data.get_session_state().to_i32().ok_or_else(|| {
+ error!("Failed converting session_state to i32");
+ Error::JniCall(JniError::Unknown)
+ })?;
+ let reason_code = data.get_reason_code().to_i32().ok_or_else(|| {
+ error!("Failed converting reason_code to i32");
+ Error::JniCall(JniError::Unknown)
+ })?;
env.call_method(
self.obj.as_obj(),
"onSessionStatusNotificationReceived",
@@ -215,7 +223,10 @@ impl EventManagerImpl {
env: &JNIEnv,
data: GenericErrorPacket,
) -> Result<()> {
- let status = data.get_status().to_i32().expect("Failed converting status to i32");
+ let status = data.get_status().to_i32().ok_or_else(|| {
+ error!("Failed converting status to i32");
+ Error::JniCall(JniError::Unknown)
+ })?;
env.call_method(
self.obj.as_obj(),
"onCoreGenericErrorNotificationReceived",
@@ -257,9 +268,11 @@ impl EventManagerImpl {
two_way_measurement: &'a ShortAddressTwoWayRangingMeasurement,
) -> Result<JObject<'a>> {
let mac_address_arr = two_way_measurement.mac_address.to_ne_bytes();
- let mac_address_java = env.new_byte_array(
- SHORT_MAC_ADDRESS_LEN.to_i32().expect("Failed converting mac address len to i32"),
- )?;
+ let mac_address_java =
+ env.new_byte_array(SHORT_MAC_ADDRESS_LEN.to_i32().ok_or_else(|| {
+ error!("Failed converting mac address len to i32");
+ Error::JniCall(JniError::Unknown)
+ })?)?;
// Convert from [u8] to [i8] since java does not support unsigned byte.
let mac_address_arr_i8 = mac_address_arr.map(|x| x as i8);
env.set_byte_array_region(mac_address_java, 0, &mac_address_arr_i8)?;
@@ -268,72 +281,64 @@ impl EventManagerImpl {
"([BIIIIIIIIIIII)V",
&[
JValue::Object(JObject::from(mac_address_java)),
+ JValue::Int(two_way_measurement.status.to_i32().ok_or_else(|| {
+ error!("Failed converting status to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.nlos.to_i32().ok_or_else(|| {
+ error!("Failed converting nlos to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.distance.to_i32().ok_or_else(|| {
+ error!("Failed converting distance to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.aoa_azimuth.to_i32().ok_or_else(|| {
+ error!("Failed converting aoa azimuth to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.aoa_azimuth_fom.to_i32().ok_or_else(|| {
+ error!("Failed converting aoa azimuth fom to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.aoa_elevation.to_i32().ok_or_else(|| {
+ error!("Failed converting aoa elevation to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.aoa_elevation_fom.to_i32().ok_or_else(|| {
+ error!("Failed converting aoa elevation fom to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.aoa_destination_azimuth.to_i32().ok_or_else(
+ || {
+ error!("Failed converting dest aoa azimuth to i32");
+ Error::JniCall(JniError::Unknown)
+ },
+ )?),
+ JValue::Int(two_way_measurement.aoa_destination_azimuth_fom.to_i32().ok_or_else(
+ || {
+ error!("Failed converting dest aoa azimuth fom to i32");
+ Error::JniCall(JniError::Unknown)
+ },
+ )?),
+ JValue::Int(two_way_measurement.aoa_destination_elevation.to_i32().ok_or_else(
+ || {
+ error!("Failed converting dest aoa elevation to i32");
+ Error::JniCall(JniError::Unknown)
+ },
+ )?),
JValue::Int(
- two_way_measurement.status.to_i32().expect("Failed converting status to i32"),
- ),
- JValue::Int(
- two_way_measurement.nlos.to_i32().expect("Failed converting nlos to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .distance
- .to_i32()
- .expect("Failed converting distance to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_azimuth
- .to_i32()
- .expect("Failed converting aoa azimuth to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_azimuth_fom
- .to_i32()
- .expect("Failed converting aoa azimuth fom to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_elevation
- .to_i32()
- .expect("Failed converting aoa elevation to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_elevation_fom
- .to_i32()
- .expect("Failed converting aoa elevation fom to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_destination_azimuth
- .to_i32()
- .expect("Failed converting dest aoa azimuth to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_destination_azimuth_fom
- .to_i32()
- .expect("Failed converting dest aoa azimuth fom to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_destination_elevation
- .to_i32()
- .expect("Failed converting dest aoa elevation to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_destination_elevation_fom
- .to_i32()
- .expect("Failed converting dest aoa elevation azimuth to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .slot_index
- .to_i32()
- .expect("Failed converting slot index to i32"),
- ),
+ two_way_measurement.aoa_destination_elevation_fom.to_i32().ok_or_else(
+ || {
+ error!("Failed converting dest aoa elevation azimuth to i32");
+ Error::JniCall(JniError::Unknown)
+ },
+ )?,
+ ),
+ JValue::Int(two_way_measurement.slot_index.to_i32().ok_or_else(|| {
+ error!("Failed converting slot index to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
],
)
}
@@ -344,9 +349,11 @@ impl EventManagerImpl {
two_way_measurement: &'a ExtendedAddressTwoWayRangingMeasurement,
) -> Result<JObject<'a>> {
let mac_address_arr = two_way_measurement.mac_address.to_ne_bytes();
- let mac_address_java = env.new_byte_array(
- EXTENDED_MAC_ADDRESS_LEN.to_i32().expect("Failed converting mac address len to i32"),
- )?;
+ let mac_address_java =
+ env.new_byte_array(EXTENDED_MAC_ADDRESS_LEN.to_i32().ok_or_else(|| {
+ error!("Failed converting mac address len to i32");
+ Error::JniCall(JniError::Unknown)
+ })?)?;
// Convert from [u8] to [i8] since java does not support unsigned byte.
let mac_address_arr_i8 = mac_address_arr.map(|x| x as i8);
env.set_byte_array_region(mac_address_java, 0, &mac_address_arr_i8)?;
@@ -355,72 +362,64 @@ impl EventManagerImpl {
"([BIIIIIIIIIIII)V",
&[
JValue::Object(JObject::from(mac_address_java)),
+ JValue::Int(two_way_measurement.status.to_i32().ok_or_else(|| {
+ error!("Failed converting status to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.nlos.to_i32().ok_or_else(|| {
+ error!("Failed converting nlos to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.distance.to_i32().ok_or_else(|| {
+ error!("Failed converting distance to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.aoa_azimuth.to_i32().ok_or_else(|| {
+ error!("Failed converting aoa azimuth to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.aoa_azimuth_fom.to_i32().ok_or_else(|| {
+ error!("Failed converting aoa azimuth fom to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.aoa_elevation.to_i32().ok_or_else(|| {
+ error!("Failed converting aoa elevation to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.aoa_elevation_fom.to_i32().ok_or_else(|| {
+ error!("Failed converting aoa elevation fom to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(two_way_measurement.aoa_destination_azimuth.to_i32().ok_or_else(
+ || {
+ error!("Failed converting dest aoa azimuth to i32");
+ Error::JniCall(JniError::Unknown)
+ },
+ )?),
+ JValue::Int(two_way_measurement.aoa_destination_azimuth_fom.to_i32().ok_or_else(
+ || {
+ error!("Failed converting dest aoa azimuth fom to i32");
+ Error::JniCall(JniError::Unknown)
+ },
+ )?),
+ JValue::Int(two_way_measurement.aoa_destination_elevation.to_i32().ok_or_else(
+ || {
+ error!("Failed converting dest aoa elevation to i32");
+ Error::JniCall(JniError::Unknown)
+ },
+ )?),
JValue::Int(
- two_way_measurement.status.to_i32().expect("Failed converting status to i32"),
- ),
- JValue::Int(
- two_way_measurement.nlos.to_i32().expect("Failed converting nlos to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .distance
- .to_i32()
- .expect("Failed converting distance to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_azimuth
- .to_i32()
- .expect("Failed converting aoa azimuth to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_azimuth_fom
- .to_i32()
- .expect("Failed converting aoa azimuth fom to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_elevation
- .to_i32()
- .expect("Failed converting aoa elevation to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_elevation_fom
- .to_i32()
- .expect("Failed converting aoa elevation fom to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_destination_azimuth
- .to_i32()
- .expect("Failed converting dest aoa azimuth to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_destination_azimuth_fom
- .to_i32()
- .expect("Failed converting dest aoa azimuth fom to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_destination_elevation
- .to_i32()
- .expect("Failed converting dest aoa elevation to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .aoa_destination_elevation_fom
- .to_i32()
- .expect("Failed converting dest aoa elevation azimuth to i32"),
- ),
- JValue::Int(
- two_way_measurement
- .slot_index
- .to_i32()
- .expect("Failed converting slot index to i32"),
- ),
+ two_way_measurement.aoa_destination_elevation_fom.to_i32().ok_or_else(
+ || {
+ error!("Failed converting dest aoa elevation azimuth to i32");
+ Error::JniCall(JniError::Unknown)
+ },
+ )?,
+ ),
+ JValue::Int(two_way_measurement.slot_index.to_i32().ok_or_else(|| {
+ error!("Failed converting slot index to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
],
)
}
@@ -437,32 +436,30 @@ impl EventManagerImpl {
ranging_data_class,
"(JJIJIII[Lcom/android/server/uwb/data/UwbTwoWayMeasurement;)V",
&[
- JValue::Long(
- data.get_sequence_number().to_i64().expect("Failed converting seq num to i64"),
- ),
- JValue::Long(
- data.get_session_id().to_i64().expect("Failed converting session id to i64"),
- ),
- JValue::Int(
- data.get_rcr_indicator()
- .to_i32()
- .expect("Failed converting rcr indicator to i32"),
- ),
- JValue::Long(
- data.get_current_ranging_interval()
- .to_i64()
- .expect("Failed converting current ranging interval to i32"),
- ),
- JValue::Int(
- data.get_ranging_measurement_type()
- .to_i32()
- .expect("Failed converting ranging measurement type to i32"),
- ),
- JValue::Int(
- data.get_mac_address_indicator()
- .to_i32()
- .expect("Failed converting mac address indicator to i32"),
- ),
+ JValue::Long(data.get_sequence_number().to_i64().ok_or_else(|| {
+ error!("Failed converting seq num to i64");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Long(data.get_session_id().to_i64().ok_or_else(|| {
+ error!("Failed converting session id to i64");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(data.get_rcr_indicator().to_i32().ok_or_else(|| {
+ error!("Failed converting rcr indicator to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Long(data.get_current_ranging_interval().to_i64().ok_or_else(|| {
+ error!("Failed converting current ranging interval to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(data.get_ranging_measurement_type().to_i32().ok_or_else(|| {
+ error!("Failed converting ranging measurement type to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(data.get_mac_address_indicator().to_i32().ok_or_else(|| {
+ error!("Failed converting mac address indicator to i32");
+ Error::JniCall(JniError::Unknown)
+ })?),
JValue::Int(num_two_way_measurements),
JValue::Object(JObject::from(two_way_measurements_java)),
],
@@ -479,17 +476,16 @@ impl EventManagerImpl {
EventManagerImpl::create_zeroed_two_way_measurement_java(
env,
two_way_measurement_class,
- env.new_byte_array(
- EXTENDED_MAC_ADDRESS_LEN
- .to_i32()
- .expect("Failed converting mac address len to i32"),
- )?,
+ env.new_byte_array(EXTENDED_MAC_ADDRESS_LEN.to_i32().ok_or_else(|| {
+ error!("Failed converting mac address len to i32");
+ Error::JniCall(JniError::Unknown)
+ })?)?,
)?;
- let num_two_way_measurements: i32 = data
- .get_two_way_ranging_measurements()
- .len()
- .to_i32()
- .expect("Failed converting len to i32");
+ let num_two_way_measurements: i32 =
+ data.get_two_way_ranging_measurements().len().to_i32().ok_or_else(|| {
+ error!("Failed converting len to i32");
+ Error::JniCall(JniError::Unknown)
+ })?;
let two_way_measurements_java = env.new_object_array(
num_two_way_measurements,
two_way_measurement_class,
@@ -504,7 +500,10 @@ impl EventManagerImpl {
)?;
env.set_object_array_element(
two_way_measurements_java,
- i.to_i32().expect("Failed converting idx to i32"),
+ i.to_i32().ok_or_else(|| {
+ error!("Failed converting idx to i32");
+ Error::JniCall(JniError::Unknown)
+ })?,
two_way_measurement_java,
)?
}
@@ -533,17 +532,16 @@ impl EventManagerImpl {
EventManagerImpl::create_zeroed_two_way_measurement_java(
env,
two_way_measurement_class,
- env.new_byte_array(
- EXTENDED_MAC_ADDRESS_LEN
- .to_i32()
- .expect("Failed converting mac address len to i32"),
- )?,
+ env.new_byte_array(EXTENDED_MAC_ADDRESS_LEN.to_i32().ok_or_else(|| {
+ error!("Failed converting mac address len to i32");
+ Error::JniCall(JniError::Unknown)
+ })?)?,
)?;
- let num_two_way_measurements: i32 = data
- .get_two_way_ranging_measurements()
- .len()
- .to_i32()
- .expect("Failed converting len to i32");
+ let num_two_way_measurements: i32 =
+ data.get_two_way_ranging_measurements().len().to_i32().ok_or_else(|| {
+ error!("Failed converting len to i32");
+ Error::JniCall(JniError::Unknown)
+ })?;
let two_way_measurements_java = env.new_object_array(
num_two_way_measurements,
two_way_measurement_class,
@@ -558,7 +556,10 @@ impl EventManagerImpl {
)?;
env.set_object_array_element(
two_way_measurements_java,
- i.to_i32().expect("Failed converting idx to i32"),
+ i.to_i32().ok_or_else(|| {
+ error!("Failed converting idx to i32");
+ Error::JniCall(JniError::Unknown)
+ })?,
two_way_measurement_java,
)?;
}
@@ -586,8 +587,10 @@ impl EventManagerImpl {
self.find_class(env, MULTICAST_LIST_UPDATE_STATUS_CLASS)?;
let controlee_status = data.get_controlee_status();
- let count: i32 =
- controlee_status.len().try_into().expect("Failed to convert controlee status length");
+ let count: i32 = controlee_status.len().try_into().map_err(|_| {
+ error!("Failed to convert controlee status length");
+ Error::JniCall(JniError::Unknown)
+ })?;
let mut mac_address_list: Vec<i32> = Vec::new();
let mut subsession_id_list: Vec<i64> = Vec::new();
let mut status_list: Vec<i32> = Vec::new();
@@ -597,7 +600,7 @@ impl EventManagerImpl {
subsession_id_list.push(iter.subsession_id.into());
status_list.push(iter.status.to_i32().ok_or_else(|| {
error!("Failed to convert controlee_status's status field: {:?}", iter.status);
- Error::JavaException
+ Error::JniCall(JniError::Unknown)
})?);
}
@@ -612,14 +615,14 @@ impl EventManagerImpl {
uwb_multicast_update_class,
"(JII[I[J[I)V",
&[
- JValue::Long(
- data.get_session_id().try_into().expect("Could not convert session_id"),
- ),
- JValue::Int(
- data.get_remaining_multicast_list_size()
- .try_into()
- .expect("Could not convert remaining multicast list size"),
- ),
+ JValue::Long(data.get_session_id().try_into().map_err(|_| {
+ error!("Could not convert session_id");
+ Error::JniCall(JniError::Unknown)
+ })?),
+ JValue::Int(data.get_remaining_multicast_list_size().try_into().map_err(|_| {
+ error!("Could not convert remaining multicast list size");
+ Error::JniCall(JniError::Unknown)
+ })?),
JValue::Int(count),
JValue::Object(JObject::from(mac_address_jintarray)),
JValue::Object(JObject::from(subsession_id_jlongarray)),
@@ -670,8 +673,14 @@ impl EventManagerImpl {
env: &JNIEnv,
data: UciNotificationPacket,
) -> Result<()> {
- let gid: i32 = data.get_group_id().to_i32().expect("Failed to convert gid");
- let oid: i32 = data.get_opcode().to_i32().expect("Failed to convert gid");
+ let gid: i32 = data.get_group_id().to_i32().ok_or_else(|| {
+ error!("Failed to convert gid");
+ Error::JniCall(JniError::Unknown)
+ })?;
+ let oid: i32 = data.get_opcode().to_i32().ok_or_else(|| {
+ error!("Failed to convert gid");
+ Error::JniCall(JniError::Unknown)
+ })?;
let payload: Vec<u8> = EventManagerImpl::get_vendor_uci_payload(data)?;
let payload_jbytearray = env.byte_array_from_slice(payload.as_ref())?;