From 86998a032ebe5f8ed9f5b3e02ef4e459c1bd866b Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 2 Feb 2023 17:12:41 +0800 Subject: [PATCH] ksud: fallback to system mount when rust lib mount failed --- userspace/ksud/src/module.rs | 45 +++++++++++++++--------------------- userspace/ksud/src/mount.rs | 13 ++++++++--- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/userspace/ksud/src/module.rs b/userspace/ksud/src/module.rs index 06cb0749..c2756e32 100644 --- a/userspace/ksud/src/module.rs +++ b/userspace/ksud/src/module.rs @@ -505,35 +505,29 @@ fn do_install_module(zip: String) -> Result<()> { // mount the modules_update.img to mountpoint println!("- Mounting image"); - { - // we need auto drop, so we use a block here - mount::mount_ext4(tmp_module_img, module_update_tmp_dir, true)?; + mount::AutoMountExt4::try_new(tmp_module_img, module_update_tmp_dir)?; - setsyscon(module_update_tmp_dir)?; + setsyscon(module_update_tmp_dir)?; - let module_dir = format!("{module_update_tmp_dir}/{module_id}"); - ensure_clean_dir(&module_dir)?; - info!("module dir: {}", module_dir); + let module_dir = format!("{module_update_tmp_dir}/{module_id}"); + ensure_clean_dir(&module_dir)?; + info!("module dir: {}", module_dir); - // unzip the image and move it to modules_update/ dir - let file = File::open(&zip)?; - let mut archive = zip::ZipArchive::new(file)?; - archive.extract(&module_dir)?; + // unzip the image and move it to modules_update/ dir + let file = File::open(&zip)?; + let mut archive = zip::ZipArchive::new(file)?; + archive.extract(&module_dir)?; - // set selinux for module/system dir - let mut module_system_dir = PathBuf::from(module_dir); - module_system_dir.push("system"); - let module_system_dir = module_system_dir.as_path(); - if module_system_dir.exists() { - let path = module_system_dir.to_str().unwrap(); - restore_syscon(path)?; - } - - exec_install_script(&zip)?; + // set selinux for module/system dir + let mut module_system_dir = PathBuf::from(module_dir); + module_system_dir.push("system"); + let module_system_dir = module_system_dir.as_path(); + if module_system_dir.exists() { + let path = module_system_dir.to_str().unwrap(); + restore_syscon(path)?; } - // remove modules_update dir, ignore the error - remove_dir_all(module_update_tmp_dir)?; + exec_install_script(&zip)?; // all done, rename the tmp image to modules_update.img if std::fs::rename(tmp_module_img, defs::MODULE_UPDATE_IMG).is_err() { @@ -551,7 +545,6 @@ pub fn install_module(zip: String) -> Result<()> { // error happened, do some cleanup! let _ = std::fs::remove_file(defs::MODULE_UPDATE_TMP_IMG); let _ = mount::umount_dir(defs::MODULE_UPDATE_TMP_DIR); - let _ = std::fs::remove_dir_all(defs::MODULE_UPDATE_TMP_DIR); println!("- Error: {e}"); } result @@ -588,13 +581,11 @@ where ensure_clean_dir(update_dir)?; // mount the modules_update img - mount::mount_ext4(defs::MODULE_UPDATE_TMP_IMG, update_dir, true)?; + mount::AutoMountExt4::try_new(defs::MODULE_UPDATE_TMP_IMG, update_dir)?; // call the operation func let result = func(id, update_dir); - // umount modules_update.img - let _ = mount::umount_dir(update_dir); let _ = remove_dir_all(update_dir); std::fs::rename(modules_update_tmp_img, defs::MODULE_UPDATE_IMG)?; diff --git a/userspace/ksud/src/mount.rs b/userspace/ksud/src/mount.rs index a49f1d8c..deb8ed44 100644 --- a/userspace/ksud/src/mount.rs +++ b/userspace/ksud/src/mount.rs @@ -7,15 +7,16 @@ use retry::delay::NoDelay; #[cfg(target_os = "android")] use sys_mount::{unmount, FilesystemType, Mount, MountFlags, Unmount, UnmountFlags}; -#[cfg(target_os = "android")] -struct AutoMountExt4 { +#[allow(dead_code)] +pub struct AutoMountExt4 { mnt: String, + #[cfg(target_os = "android")] mount: Option, } -#[cfg(target_os = "android")] #[allow(dead_code)] impl AutoMountExt4 { + #[cfg(target_os = "android")] pub fn try_new(src: &str, mnt: &str) -> Result { let result = Mount::builder() .fstype(FilesystemType::from("ext4")) @@ -50,6 +51,12 @@ impl AutoMountExt4 { } } + #[cfg(not(target_os = "android"))] + pub fn try_new(_src: &str, _mnt: &str) -> Result { + unimplemented!() + } + + #[cfg(target_os = "android")] pub fn umount(&self) -> Result<()> { match self.mount { Some(ref mount) => mount