[netstack] avoid crash on missing interface
NET-2243 #done
Change-Id: I1b6466ed5acc01c78c8bc544d90cffdc734d9304
diff --git a/src/connectivity/network/netstack/fuchsia_net_stack.go b/src/connectivity/network/netstack/fuchsia_net_stack.go
index 4e19d12..dba43d0 100644
--- a/src/connectivity/network/netstack/fuchsia_net_stack.go
+++ b/src/connectivity/network/netstack/fuchsia_net_stack.go
@@ -130,13 +130,14 @@
func (ns *Netstack) getInterface(id uint64) (*stack.InterfaceInfo, *stack.Error) {
ns.mu.Lock()
ifs, ok := ns.mu.ifStates[tcpip.NICID(id)]
+ if !ok {
+ ns.mu.Unlock()
+ return nil, &stack.Error{Type: stack.ErrorTypeNotFound}
+ }
addresses, subnets := ns.getAddressesLocked(ifs.nicid)
ns.mu.Unlock()
- if ok {
- return getInterfaceInfo(ifs, addresses, subnets), nil
- }
- return nil, &stack.Error{Type: stack.ErrorTypeNotFound}
+ return getInterfaceInfo(ifs, addresses, subnets), nil
}
func (ns *Netstack) setInterfaceState(id uint64, enabled bool) *stack.Error {
diff --git a/src/connectivity/network/tests/src/lib.rs b/src/connectivity/network/tests/src/lib.rs
index cd807cf..a8808ea 100644
--- a/src/connectivity/network/tests/src/lib.rs
+++ b/src/connectivity/network/tests/src/lib.rs
@@ -158,7 +158,7 @@
interface.features & fidl_fuchsia_hardware_ethernet::INFO_FEATURE_LOOPBACK,
0
);
- assert_eq!(interface.flags & fidl_fuchsia_netstack::NET_INTERFACE_FLAG_UP, 0,);
+ assert_eq!(interface.flags & fidl_fuchsia_netstack::NET_INTERFACE_FLAG_UP, 0);
Ok(())
},
))
@@ -213,9 +213,34 @@
}),
prefix_len: 0,
};
- let error = await!(stack.add_interface_address(max_id + 1, &mut interface_address,))
- .context("failed to add interface address")?
- .ok_or(failure::err_msg("failed to get add interface address response"))?;
+ let error = await!(stack.add_interface_address(max_id + 1, &mut interface_address))
+ .context("failed to call add interface address")?
+ .ok_or(failure::err_msg("failed to get add interface address error"))?;
+ assert_eq!(
+ error.as_ref(),
+ &fidl_fuchsia_net_stack::Error { type_: fidl_fuchsia_net_stack::ErrorType::NotFound }
+ );
+ Ok(())
+}
+
+#[fuchsia_async::run_singlethreaded(test)]
+async fn get_interface_info_not_found() -> Result {
+ let name = stringify!(get_interface_info_not_found);
+
+ let sandbox = fuchsia_component::client::connect_to_service::<
+ fidl_fuchsia_netemul_sandbox::SandboxMarker,
+ >()
+ .context("failed to connect to sandbox")?;
+ let managed_environment = create_netstack_environment(&sandbox, name.to_string())
+ .context("failed to create netstack environment")?;
+ let stack = connect_to_service::<fidl_fuchsia_net_stack::StackMarker>(&managed_environment)
+ .context("failed to connect to netstack")?;
+ let interfaces = await!(stack.list_interfaces()).context("failed to list interfaces")?;
+ let max_id = interfaces.iter().map(|interface| interface.id).max().unwrap_or(0);
+ let (info, error) = await!(stack.get_interface_info(max_id + 1))
+ .context("failed to call get interface info")?;
+ assert_eq!(info, None);
+ let error = error.ok_or(failure::err_msg("failed to get get interface info error"))?;
assert_eq!(
error.as_ref(),
&fidl_fuchsia_net_stack::Error { type_: fidl_fuchsia_net_stack::ErrorType::NotFound }