Skip to content

Commit 08e9e98

Browse files
committed
Fix unsafe unwrap and improve error handling in network device operations.
Signed-off-by: nayuta-ai <[email protected]>
1 parent bb31374 commit 08e9e98

File tree

3 files changed

+22
-26
lines changed

3 files changed

+22
-26
lines changed

crates/libcontainer/src/process/container_main_process.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ use std::path::PathBuf;
33

44
use nix::sys::wait::{waitpid, WaitStatus};
55
use nix::unistd::Pid;
6-
use oci_spec::runtime::{Linux, LinuxNamespaceType};
6+
use oci_spec::runtime::{Linux, LinuxNamespace, LinuxNamespaceType};
77

88
use crate::network::network_device::dev_change_net_namespace;
9+
use crate::network::serialize::SerializableAddress;
910
use crate::process::args::ContainerArgs;
1011
use crate::process::fork::{self, CloneCb};
1112
use crate::process::intel_rdt::setup_intel_rdt;
@@ -244,7 +245,6 @@ fn setup_network_device(
244245
main_receiver: &mut channel::MainReceiver,
245246
init_sender: &mut channel::InitSender,
246247
) -> Result<()> {
247-
let mut addrs_map = HashMap::new();
248248
// host network pods does not move network devices.
249249
if let Some(namespaces) = linux.namespaces() {
250250
if !namespaces
@@ -274,18 +274,17 @@ fn setup_network_device(
274274
// See: https://github.com/opencontainers/runtime-spec/blob/27cb0027fd92ef81eda1ea3a8153b8337f56d94a/config-linux.md#namespace-lifecycle-and-container-termination
275275
if let Some(devices) = linux.net_devices() {
276276
main_receiver.wait_for_network_setup_ready()?;
277-
for (name, net_dev) in devices {
278-
let addrs = dev_change_net_namespace(
279-
name,
280-
ns_path,
281-
net_dev,
282-
)
283-
.map_err(|err| {
284-
tracing::error!("failed to dev_change_net_namespace: {}", err);
285-
err
286-
})?;
287-
addrs_map.insert(name.clone(), addrs);
288-
}
277+
let addrs_map = devices
278+
.iter()
279+
.map(|(name, net_dev)| {
280+
let addrs =
281+
dev_change_net_namespace(name, ns_path, net_dev).map_err(|err| {
282+
tracing::error!("failed to dev_change_net_namespace: {}", err);
283+
err
284+
})?;
285+
Ok((name.clone(), addrs))
286+
})
287+
.collect::<Result<HashMap<String, Vec<SerializableAddress>>>>()?;
289288
init_sender.move_network_device(addrs_map)?;
290289
}
291290
}

crates/libcontainer/src/process/init/process.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -882,12 +882,10 @@ fn setup_net_devices(
882882
let addrs_map = init_receiver.wait_for_move_network_device()?;
883883
for (name, net_dev) in net_device {
884884
if let Some(serialize_addrs) = addrs_map.get(name) {
885-
setup_network_device(name, net_dev, serialize_addrs.clone()).map_err(
886-
|err| {
887-
tracing::error!(?err, "failed to setup_network_device");
888-
err
889-
},
890-
)?;
885+
setup_network_device(name, net_dev, serialize_addrs.clone()).map_err(|err| {
886+
tracing::error!(?err, "failed to setup_network_device");
887+
err
888+
})?;
891889
}
892890
}
893891

crates/libcontainer/src/utils.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ pub fn validate_spec_for_net_devices(
349349
.any(|ns| ns.typ() == LinuxNamespaceType::Network),
350350
None => false,
351351
};
352-
352+
353353
if !has_net_namespace {
354354
return Err(NetDevicesError::NoNetNamespace);
355355
}
@@ -360,7 +360,7 @@ pub fn validate_spec_for_net_devices(
360360
}
361361

362362
if let Some(devices) = linux.net_devices() {
363-
for (name, net_dev) in devices {
363+
devices.iter().try_for_each(|(name, net_dev)| {
364364
if !dev_valid_name(name) {
365365
return Err(NetDevicesError::InvalidDeviceName(name.into()));
366366
}
@@ -369,7 +369,8 @@ pub fn validate_spec_for_net_devices(
369369
return Err(NetDevicesError::InvalidDeviceName(dev_name.into()));
370370
}
371371
}
372-
}
372+
Ok(())
373+
})?;
373374
}
374375

375376
Ok(())
@@ -581,9 +582,7 @@ mod tests {
581582
.map(|(key, val)| {
582583
(
583584
key.into(),
584-
LinuxNetDevice::default()
585-
.set_name(Some(val.into()))
586-
.clone(),
585+
LinuxNetDevice::default().set_name(Some(val.into())).clone(),
587586
)
588587
})
589588
.collect();

0 commit comments

Comments
 (0)