fix(pty) : Use more safe package rustix to resize pty

avoid using the nix's unsafe ioctl call
Signed-off-by: jokemanfire <hu.dingyang@zte.com.cn>
This commit is contained in:
jokemanfire 2025-10-09 19:57:42 +08:00 committed by Maksym Pavlenko
parent c1bd8a78d1
commit 41d7e2febf
3 changed files with 11 additions and 21 deletions

View File

@ -39,6 +39,10 @@ uuid.workspace = true
# Async dependencies
async-trait.workspace = true
tokio = { workspace = true, features = ["full"] }
rustix = { version = "1", features = ["termios"] }
[package.metadata.cargo-machete]
ignored = ["libc"]
[target.'cfg(target_os = "linux")'.dependencies]
cgroups-rs.workspace = true

View File

@ -14,23 +14,19 @@
limitations under the License.
*/
use std::{
os::unix::io::AsRawFd,
sync::{Arc, Mutex},
};
use std::sync::{Arc, Mutex};
use async_trait::async_trait;
use containerd_shim::{
ioctl_set_winsz,
protos::{
api::{ProcessInfo, StateResponse, Status},
cgroups::metrics::Metrics,
protobuf::well_known_types::timestamp::Timestamp,
},
util::asyncify,
Console, Result,
};
use oci_spec::runtime::LinuxResources;
use rustix::termios::{tcsetwinsize, Winsize};
use time::OffsetDateTime;
use tokio::{
fs::File,
@ -174,17 +170,14 @@ where
async fn resize_pty(&mut self, height: u32, width: u32) -> Result<()> {
if let Some(console) = self.console.as_ref() {
let w = libc::winsize {
let w = Winsize {
ws_row: height as u16,
ws_col: width as u16,
ws_xpixel: 0,
ws_ypixel: 0,
};
let fd = console.file.as_raw_fd();
asyncify(move || -> Result<()> {
unsafe { ioctl_set_winsz(fd, &w).map(|_x| ()).map_err(Into::into) }
})
.await?;
tcsetwinsize(&console.file, w)
.map_err(|e| containerd_shim::Error::Other(e.to_string()))?;
}
Ok(())
}

View File

@ -17,24 +17,17 @@
#![cfg_attr(feature = "docs", doc = include_str!("../README.md"))]
use std::{fs::File, path::PathBuf};
#[cfg(windows)]
use std::{fs::OpenOptions, os::windows::prelude::OpenOptionsExt};
#[cfg(unix)]
use std::{os::unix::net::UnixListener, path::Path};
pub use containerd_shim_protos as protos;
#[cfg(unix)]
use nix::ioctl_write_ptr_bad;
pub use protos::{
shim::shim::DeleteResponse,
ttrpc::{context::Context, Result as TtrpcResult},
};
use sha2::{Digest, Sha256};
#[cfg(unix)]
ioctl_write_ptr_bad!(ioctl_set_winsz, libc::TIOCSWINSZ, libc::winsize);
#[cfg(windows)]
use std::{fs::OpenOptions, os::windows::prelude::OpenOptionsExt};
#[cfg(windows)]
use windows_sys::Win32::Storage::FileSystem::FILE_FLAG_OVERLAPPED;