mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-28 00:07:16 +00:00
agent: fix panic on malformed device resource in container update
Somehow containerd is sending a malformed device in update API. While it should not happen, we should not panic either. Fixes: #946 Signed-off-by: Peng Tao <bergwolf@hyper.sh>
This commit is contained in:
parent
183823398d
commit
b33d4fe708
@ -266,19 +266,22 @@ fn set_devices_resources(
|
|||||||
let mut devices = vec![];
|
let mut devices = vec![];
|
||||||
|
|
||||||
for d in device_resources.iter() {
|
for d in device_resources.iter() {
|
||||||
let dev = linux_device_group_to_cgroup_device(&d);
|
if let Some(dev) = linux_device_group_to_cgroup_device(&d) {
|
||||||
devices.push(dev);
|
devices.push(dev);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for d in DEFAULT_DEVICES.iter() {
|
for d in DEFAULT_DEVICES.iter() {
|
||||||
let dev = linux_device_to_cgroup_device(&d);
|
if let Some(dev) = linux_device_to_cgroup_device(&d) {
|
||||||
devices.push(dev);
|
devices.push(dev);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for d in DEFAULT_ALLOWED_DEVICES.iter() {
|
for d in DEFAULT_ALLOWED_DEVICES.iter() {
|
||||||
let dev = linux_device_group_to_cgroup_device(&d);
|
if let Some(dev) = linux_device_group_to_cgroup_device(&d) {
|
||||||
devices.push(dev);
|
devices.push(dev);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
res.devices.update_values = true;
|
res.devices.update_values = true;
|
||||||
res.devices.devices = devices;
|
res.devices.devices = devices;
|
||||||
@ -465,8 +468,11 @@ fn build_blk_io_device_throttle_resource(
|
|||||||
blk_io_device_throttle_resources
|
blk_io_device_throttle_resources
|
||||||
}
|
}
|
||||||
|
|
||||||
fn linux_device_to_cgroup_device(d: &LinuxDevice) -> DeviceResource {
|
fn linux_device_to_cgroup_device(d: &LinuxDevice) -> Option<DeviceResource> {
|
||||||
let dev_type = DeviceType::from_char(d.r#type.chars().next()).unwrap();
|
let dev_type = match DeviceType::from_char(d.r#type.chars().next()) {
|
||||||
|
Some(t) => t,
|
||||||
|
None => return None,
|
||||||
|
};
|
||||||
|
|
||||||
let permissions = vec![
|
let permissions = vec![
|
||||||
DevicePermissions::Read,
|
DevicePermissions::Read,
|
||||||
@ -474,17 +480,20 @@ fn linux_device_to_cgroup_device(d: &LinuxDevice) -> DeviceResource {
|
|||||||
DevicePermissions::MkNod,
|
DevicePermissions::MkNod,
|
||||||
];
|
];
|
||||||
|
|
||||||
DeviceResource {
|
Some(DeviceResource {
|
||||||
allow: true,
|
allow: true,
|
||||||
devtype: dev_type,
|
devtype: dev_type,
|
||||||
major: d.major,
|
major: d.major,
|
||||||
minor: d.minor,
|
minor: d.minor,
|
||||||
access: permissions,
|
access: permissions,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn linux_device_group_to_cgroup_device(d: &LinuxDeviceCgroup) -> DeviceResource {
|
fn linux_device_group_to_cgroup_device(d: &LinuxDeviceCgroup) -> Option<DeviceResource> {
|
||||||
let dev_type = DeviceType::from_char(d.r#type.chars().next()).unwrap();
|
let dev_type = match DeviceType::from_char(d.r#type.chars().next()) {
|
||||||
|
Some(t) => t,
|
||||||
|
None => return None,
|
||||||
|
};
|
||||||
|
|
||||||
let mut permissions: Vec<DevicePermissions> = vec![];
|
let mut permissions: Vec<DevicePermissions> = vec![];
|
||||||
for p in d.access.chars().collect::<Vec<char>>() {
|
for p in d.access.chars().collect::<Vec<char>>() {
|
||||||
@ -496,13 +505,13 @@ fn linux_device_group_to_cgroup_device(d: &LinuxDeviceCgroup) -> DeviceResource
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceResource {
|
Some(DeviceResource {
|
||||||
allow: d.allow,
|
allow: d.allow,
|
||||||
devtype: dev_type,
|
devtype: dev_type,
|
||||||
major: d.major.unwrap_or(0),
|
major: d.major.unwrap_or(0),
|
||||||
minor: d.minor.unwrap_or(0),
|
minor: d.minor.unwrap_or(0),
|
||||||
access: permissions,
|
access: permissions,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// split space separated values into an vector of u64
|
// split space separated values into an vector of u64
|
||||||
|
Loading…
Reference in New Issue
Block a user