[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 }