update to 1.2.1-10

Signed-off-by: renoseven <dev@renoseven.net>
This commit is contained in:
renoseven 2024-08-16 10:31:54 +08:00
parent 27bb77c699
commit aaca4c9c5f
48 changed files with 9958 additions and 77 deletions

View File

@ -1,7 +1,7 @@
From 8c09e8b3d9d59012c1019c01ac2246c770501c75 Mon Sep 17 00:00:00 2001 From 8c09e8b3d9d59012c1019c01ac2246c770501c75 Mon Sep 17 00:00:00 2001
From: ningyu <405888464@qq.com> From: ningyu <405888464@qq.com>
Date: Sun, 7 Apr 2024 10:50:13 +0800 Date: Sun, 7 Apr 2024 10:50:13 +0800
Subject: [PATCH 01/20] upatch-hijacker: fix compile bug container_of_safe => Subject: [PATCH] upatch-hijacker: fix compile bug container_of_safe =>
container_of container_of
--- ---

View File

@ -1,8 +1,8 @@
From a535e14a7db49df3c8aab017e32b92d8e5bb4087 Mon Sep 17 00:00:00 2001 From a535e14a7db49df3c8aab017e32b92d8e5bb4087 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Wed, 10 Apr 2024 10:25:21 +0800 Date: Wed, 10 Apr 2024 10:25:21 +0800
Subject: [PATCH 02/20] daemon: fix 'cannot get file selinux xattr when selinux Subject: [PATCH] daemon: fix 'cannot get file selinux xattr when selinux is
is not enforcing' issue not enforcing' issue
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,8 +1,8 @@
From e5294afa8135f54f44196bd92e5a32c2b09b9bda Mon Sep 17 00:00:00 2001 From e5294afa8135f54f44196bd92e5a32c2b09b9bda Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Wed, 10 Apr 2024 12:19:51 +0800 Date: Wed, 10 Apr 2024 12:19:51 +0800
Subject: [PATCH 03/20] syscared: fix 'syscare check command does not check Subject: [PATCH] syscared: fix 'syscare check command does not check symbol
symbol confiliction' issue confiliction' issue
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,8 +1,7 @@
From 32c3d16175b93627504981d05a1a3e3ec603415e Mon Sep 17 00:00:00 2001 From 32c3d16175b93627504981d05a1a3e3ec603415e Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Wed, 10 Apr 2024 19:30:56 +0800 Date: Wed, 10 Apr 2024 19:30:56 +0800
Subject: [PATCH 04/20] syscared: fix 'cannot find process of dynlib patch' Subject: [PATCH] syscared: fix 'cannot find process of dynlib patch' issue
issue
1. For detecting process mapped dynamic library, 1. For detecting process mapped dynamic library,
we use /proc/$pid/map_files instead. we use /proc/$pid/map_files instead.

View File

@ -1,7 +1,7 @@
From a61958c837b70c0c530d32ee58b616ab9ad01f4b Mon Sep 17 00:00:00 2001 From a61958c837b70c0c530d32ee58b616ab9ad01f4b Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Fri, 12 Apr 2024 11:35:57 +0800 Date: Fri, 12 Apr 2024 11:35:57 +0800
Subject: [PATCH 05/20] syscared: optimize patch error logic Subject: [PATCH] syscared: optimize patch error logic
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,7 +1,7 @@
From 211e4549324a9209dc982b7426af8b832410b619 Mon Sep 17 00:00:00 2001 From 211e4549324a9209dc982b7426af8b832410b619 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Fri, 12 Apr 2024 11:40:25 +0800 Date: Fri, 12 Apr 2024 11:40:25 +0800
Subject: [PATCH 06/20] syscared: optimize transaction creation logic Subject: [PATCH] syscared: optimize transaction creation logic
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,7 +1,7 @@
From a32e9f39965579064dbd504246f13c6431ffed33 Mon Sep 17 00:00:00 2001 From a32e9f39965579064dbd504246f13c6431ffed33 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Fri, 12 Apr 2024 11:50:59 +0800 Date: Fri, 12 Apr 2024 11:50:59 +0800
Subject: [PATCH 07/20] upatch-manage: optimize output Subject: [PATCH] upatch-manage: optimize output
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,7 +1,7 @@
From cc090b31139bb9aa0158e50a8a620fc41b23231c Mon Sep 17 00:00:00 2001 From cc090b31139bb9aa0158e50a8a620fc41b23231c Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Tue, 16 Apr 2024 12:44:11 +0800 Date: Tue, 16 Apr 2024 12:44:11 +0800
Subject: [PATCH 08/20] common: impl CStr::from_bytes_with_next_nul() Subject: [PATCH] common: impl CStr::from_bytes_with_next_nul()
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,7 +1,7 @@
From 354e0888188d4cabd9fff9912fa0935e4e1b4b52 Mon Sep 17 00:00:00 2001 From 354e0888188d4cabd9fff9912fa0935e4e1b4b52 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Tue, 16 Apr 2024 14:20:27 +0800 Date: Tue, 16 Apr 2024 14:20:27 +0800
Subject: [PATCH 09/20] syscared: improve patch management Subject: [PATCH] syscared: improve patch management
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,8 +1,8 @@
From a83410a74713c4f191aeb31bc9ea87b9e9f4bcc6 Mon Sep 17 00:00:00 2001 From a83410a74713c4f191aeb31bc9ea87b9e9f4bcc6 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Wed, 17 Apr 2024 19:14:19 +0800 Date: Wed, 17 Apr 2024 19:14:19 +0800
Subject: [PATCH 10/20] syscared: stop activating ignored process on new Subject: [PATCH] syscared: stop activating ignored process on new process
process start start
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,7 +1,7 @@
From 4ad0b0369cd039b64635d2c405fa244b6c6afb59 Mon Sep 17 00:00:00 2001 From 4ad0b0369cd039b64635d2c405fa244b6c6afb59 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Fri, 19 Apr 2024 12:02:23 +0800 Date: Fri, 19 Apr 2024 12:02:23 +0800
Subject: [PATCH 11/20] syscared: adapt upatch-manage exit code change Subject: [PATCH] syscared: adapt upatch-manage exit code change
1. upatch driver treats EEXIST as an error 1. upatch driver treats EEXIST as an error

View File

@ -1,7 +1,7 @@
From e04ce4a7539a469091fef8c1566a85fe6050f728 Mon Sep 17 00:00:00 2001 From e04ce4a7539a469091fef8c1566a85fe6050f728 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Fri, 19 Apr 2024 12:01:38 +0800 Date: Fri, 19 Apr 2024 12:01:38 +0800
Subject: [PATCH 12/20] upatch-manage: change exit code Subject: [PATCH] upatch-manage: change exit code
1. return more specific exit code 1. return more specific exit code
2. change exit code from EEXIST to 0 when patching existing patch (uuid) 2. change exit code from EEXIST to 0 when patching existing patch (uuid)

View File

@ -1,7 +1,7 @@
From ff07e664cb475fa74b4f6531d8e709a5dd9b55dd Mon Sep 17 00:00:00 2001 From ff07e664cb475fa74b4f6531d8e709a5dd9b55dd Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Fri, 19 Apr 2024 14:19:27 +0800 Date: Fri, 19 Apr 2024 14:19:27 +0800
Subject: [PATCH 13/20] upatch-manage: change the way to calculate frozen time Subject: [PATCH] upatch-manage: change the way to calculate frozen time
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,7 +1,7 @@
From c2fc4243ed918717bbcaa4a0c1b400051c7eded7 Mon Sep 17 00:00:00 2001 From c2fc4243ed918717bbcaa4a0c1b400051c7eded7 Mon Sep 17 00:00:00 2001
From: ningyu <ningyu9@huawei.com> From: ningyu <ningyu9@huawei.com>
Date: Tue, 9 Apr 2024 09:21:35 +0000 Date: Tue, 9 Apr 2024 09:21:35 +0000
Subject: [PATCH 14/20] abi: change uuid string to uuid bytes Subject: [PATCH] abi: change uuid string to uuid bytes
Signed-off-by: ningyu <ningyu9@huawei.com> Signed-off-by: ningyu <ningyu9@huawei.com>
--- ---

View File

@ -1,8 +1,7 @@
From 8deffbf247f51a8601e81bd65e448d9f228e98a8 Mon Sep 17 00:00:00 2001 From 8deffbf247f51a8601e81bd65e448d9f228e98a8 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Thu, 9 May 2024 18:49:29 +0800 Date: Thu, 9 May 2024 18:49:29 +0800
Subject: [PATCH 15/20] upatch-build: fix 'file detection cause build failure' Subject: [PATCH] upatch-build: fix 'file detection cause build failure' issue
issue
File relation detection does not work as we expected sometimes. File relation detection does not work as we expected sometimes.
We changed the way to parse file relations from parsing dwarf info We changed the way to parse file relations from parsing dwarf info

View File

@ -1,7 +1,7 @@
From a7140a02d69b50d57403f2c769767e5365a6aa34 Mon Sep 17 00:00:00 2001 From a7140a02d69b50d57403f2c769767e5365a6aa34 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Sat, 11 May 2024 08:26:33 +0800 Date: Sat, 11 May 2024 08:26:33 +0800
Subject: [PATCH 16/20] upatch-diff: optimize log output Subject: [PATCH] upatch-diff: optimize log output
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,7 +1,7 @@
From b43d59716bb5ae6811c3f4fcab33ca9a6704b175 Mon Sep 17 00:00:00 2001 From b43d59716bb5ae6811c3f4fcab33ca9a6704b175 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Sat, 11 May 2024 08:28:48 +0800 Date: Sat, 11 May 2024 08:28:48 +0800
Subject: [PATCH 17/20] security: change directory permission Subject: [PATCH] security: change directory permission
1. config_dir /etc/syscare drwx------. 1. config_dir /etc/syscare drwx------.
2. data_dir /usr/lib/syscare drwx------. 2. data_dir /usr/lib/syscare drwx------.

View File

@ -1,7 +1,7 @@
From bbbcb0c08f4a6a63230288485d88492465e2a593 Mon Sep 17 00:00:00 2001 From bbbcb0c08f4a6a63230288485d88492465e2a593 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Sat, 11 May 2024 10:21:58 +0800 Date: Sat, 11 May 2024 10:21:58 +0800
Subject: [PATCH 18/20] security: change daemon socket permission Subject: [PATCH] security: change daemon socket permission
1. add socket uid & gid to config file 1. add socket uid & gid to config file
default uid: 0 default uid: 0

View File

@ -1,8 +1,8 @@
From b9ae8a1ea14d46b3f4ba887fb10f9898c6f5cc53 Mon Sep 17 00:00:00 2001 From b9ae8a1ea14d46b3f4ba887fb10f9898c6f5cc53 Mon Sep 17 00:00:00 2001
From: ningyu <ningyu9@huawei.com> From: ningyu <ningyu9@huawei.com>
Date: Sat, 11 May 2024 08:06:58 +0000 Date: Sat, 11 May 2024 08:06:58 +0000
Subject: [PATCH 19/20] upatch-manage: Fixed the core dump issue after applying Subject: [PATCH] upatch-manage: Fixed the core dump issue after applying hot
hot patches to nginx on x86_64 architecture. patches to nginx on x86_64 architecture.
For non-dynamic library elf, do not place the global variables in the GOT table For non-dynamic library elf, do not place the global variables in the GOT table
--- ---

View File

@ -1,7 +1,7 @@
From fac8aa17d540e54fa0443015089cdc72c5da72e3 Mon Sep 17 00:00:00 2001 From fac8aa17d540e54fa0443015089cdc72c5da72e3 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Sat, 11 May 2024 17:31:46 +0800 Date: Sat, 11 May 2024 17:31:46 +0800
Subject: [PATCH 20/20] upatch-diff: fix 'lookup_relf failed' issue Subject: [PATCH] upatch-diff: fix 'lookup_relf failed' issue
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
--- ---

View File

@ -1,7 +1,7 @@
From 2d711186e1c134b069102e72d6d451942c931eb5 Mon Sep 17 00:00:00 2001 From 2d711186e1c134b069102e72d6d451942c931eb5 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Mon, 13 May 2024 21:27:13 +0800 Date: Mon, 13 May 2024 21:27:13 +0800
Subject: [PATCH 21/22] upatch-diff: only check changed file symbols Subject: [PATCH] upatch-diff: only check changed file symbols
1. sync compare results (SAME/NEW/CHANGED) to correlated objects 1. sync compare results (SAME/NEW/CHANGED) to correlated objects
2. mark file changes by looking up symbol changes 2. mark file changes by looking up symbol changes
@ -161,5 +161,5 @@ index 3bb35e7..676880f 100644
return (result->symbol != NULL); return (result->symbol != NULL);
-- --
2.41.0 2.34.1

View File

@ -1,7 +1,7 @@
From 06ef9f212e17cdaa93dc5255d2c881c0b52d603f Mon Sep 17 00:00:00 2001 From 06ef9f212e17cdaa93dc5255d2c881c0b52d603f Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net> From: renoseven <dev@renoseven.net>
Date: Tue, 14 May 2024 14:10:05 +0800 Date: Tue, 14 May 2024 14:10:05 +0800
Subject: [PATCH 22/22] upatch-diff: remove rela check while build rebuilding Subject: [PATCH] upatch-diff: remove rela check while build rebuilding
.eh_frame .eh_frame
Signed-off-by: renoseven <dev@renoseven.net> Signed-off-by: renoseven <dev@renoseven.net>
@ -23,5 +23,5 @@ index 6b5fc53..f9c5327 100644
/* /*
-- --
2.41.0 2.34.1

View File

@ -23,5 +23,5 @@ index 307efb5..970da92 100644
current_kernel == patch_target, current_kernel == patch_target,
"Kpatch: Patch is incompatible", "Kpatch: Patch is incompatible",
-- --
2.41.0 2.34.1

View File

@ -36,5 +36,5 @@ index ba49661..bcae962 100644
cmd_args.args(kbuild_params.patch_files.iter().map(|patch| &patch.path)); cmd_args.args(kbuild_params.patch_files.iter().map(|patch| &patch.path));
-- --
2.41.0 2.34.1

View File

@ -0,0 +1,241 @@
From 42d7bdb932dfb5bb511ab2698c4fe4f3fc4be0be Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net>
Date: Wed, 29 May 2024 22:06:09 +0800
Subject: [PATCH] all: finding executable from environment variables
Signed-off-by: renoseven <dev@renoseven.net>
---
syscare-build/src/main.rs | 10 ++++++++--
syscare-build/src/patch/user_patch/upatch_builder.rs | 2 +-
syscare/src/executor/build.rs | 7 +++----
syscare/src/main.rs | 10 ++++++++--
syscared/src/main.rs | 10 ++++++++--
syscared/src/patch/driver/upatch/sys.rs | 2 +-
upatch-build/src/main.rs | 9 ++++++++-
7 files changed, 37 insertions(+), 13 deletions(-)
diff --git a/syscare-build/src/main.rs b/syscare-build/src/main.rs
index 8928218..1faa803 100644
--- a/syscare-build/src/main.rs
+++ b/syscare-build/src/main.rs
@@ -12,7 +12,7 @@
* See the Mulan PSL v2 for more details.
*/
-use std::{process, sync::Arc};
+use std::{env, process, sync::Arc};
use anyhow::{bail, ensure, Context, Result};
use flexi_logger::{
@@ -22,7 +22,7 @@ use lazy_static::lazy_static;
use log::{error, info, LevelFilter, Record};
use syscare_abi::{PackageInfo, PackageType, PatchInfo, PatchType};
-use syscare_common::{fs, os};
+use syscare_common::{concat_os, fs, os};
mod args;
mod build_params;
@@ -44,6 +44,9 @@ const CLI_VERSION: &str = env!("CARGO_PKG_VERSION");
const CLI_ABOUT: &str = env!("CARGO_PKG_DESCRIPTION");
const CLI_UMASK: u32 = 0o022;
+const PATH_ENV_NAME: &str = "PATH";
+const PATH_ENV_VALUE: &str = "/usr/libexec/syscare";
+
const LOG_FILE_NAME: &str = "build";
const KERNEL_PKG_NAME: &str = "kernel";
@@ -70,6 +73,9 @@ impl SyscareBuild {
fn new() -> Result<Self> {
// Initialize arguments & prepare environments
os::umask::set_umask(CLI_UMASK);
+ if let Some(path_env) = env::var_os(PATH_ENV_NAME) {
+ env::set_var(PATH_ENV_NAME, concat_os!(PATH_ENV_VALUE, ":", path_env));
+ }
let args = Arguments::new()?;
let build_root = BuildRoot::new(&args.build_root)?;
diff --git a/syscare-build/src/patch/user_patch/upatch_builder.rs b/syscare-build/src/patch/user_patch/upatch_builder.rs
index 1e0e6b6..255c2d3 100644
--- a/syscare-build/src/patch/user_patch/upatch_builder.rs
+++ b/syscare-build/src/patch/user_patch/upatch_builder.rs
@@ -34,7 +34,7 @@ use crate::{build_params::BuildParameters, package::PackageImpl, patch::PatchBui
use super::{elf_relation::ElfRelation, DEBUGINFO_FILE_EXT};
-const UPATCH_BUILD_BIN: &str = "/usr/libexec/syscare/upatch-build";
+const UPATCH_BUILD_BIN: &str = "upatch-build";
const RPMBUILD_BIN: &str = "rpmbuild";
struct UBuildParameters {
diff --git a/syscare/src/executor/build.rs b/syscare/src/executor/build.rs
index f9027c7..6d3866f 100644
--- a/syscare/src/executor/build.rs
+++ b/syscare/src/executor/build.rs
@@ -19,22 +19,21 @@ use anyhow::{bail, Context, Result};
use super::CommandExecutor;
use crate::args::SubCommand;
-const SYSCARE_BUILD_PATH: &str = "/usr/libexec/syscare/syscare-build";
+const SYSCARE_BUILD_BIN: &str = "syscare-build";
pub struct BuildCommandExecutor;
impl CommandExecutor for BuildCommandExecutor {
fn invoke(&self, command: &SubCommand) -> Result<Option<i32>> {
if let SubCommand::Build { args } = command {
- let e = Command::new(SYSCARE_BUILD_PATH).args(args).exec();
+ let e = Command::new(SYSCARE_BUILD_BIN).args(args).exec();
match e.kind() {
std::io::ErrorKind::NotFound => {
bail!("Package syscare-build is not installed");
}
_ => {
- return Err(e)
- .with_context(|| format!("Failed to start {}", SYSCARE_BUILD_PATH))
+ return Err(e).with_context(|| format!("Failed to start {}", SYSCARE_BUILD_BIN))
}
}
}
diff --git a/syscare/src/main.rs b/syscare/src/main.rs
index c709f6a..dea5717 100644
--- a/syscare/src/main.rs
+++ b/syscare/src/main.rs
@@ -12,7 +12,7 @@
* See the Mulan PSL v2 for more details.
*/
-use std::{process, rc::Rc};
+use std::{env, process, rc::Rc};
use anyhow::{Context, Result};
use flexi_logger::{DeferredNow, LogSpecification, Logger, LoggerHandle, WriteMode};
@@ -25,13 +25,16 @@ mod rpc;
use args::Arguments;
use executor::{build::BuildCommandExecutor, patch::PatchCommandExecutor, CommandExecutor};
use rpc::{RpcProxy, RpcRemote};
-use syscare_common::os;
+use syscare_common::{concat_os, os};
pub const CLI_NAME: &str = env!("CARGO_PKG_NAME");
pub const CLI_VERSION: &str = env!("CARGO_PKG_VERSION");
pub const CLI_ABOUT: &str = env!("CARGO_PKG_DESCRIPTION");
const CLI_UMASK: u32 = 0o077;
+const PATH_ENV_NAME: &str = "PATH";
+const PATH_ENV_VALUE: &str = "/usr/libexec/syscare";
+
const SOCKET_FILE_NAME: &str = "syscared.sock";
const PATCH_OP_LOCK_NAME: &str = "patch_op.lock";
@@ -52,6 +55,9 @@ impl SyscareCLI {
fn new() -> Result<Self> {
// Initialize arguments & prepare environments
os::umask::set_umask(CLI_UMASK);
+ if let Some(path_env) = env::var_os(PATH_ENV_NAME) {
+ env::set_var(PATH_ENV_NAME, concat_os!(PATH_ENV_VALUE, ":", path_env));
+ }
let args = Arguments::new()?;
diff --git a/syscared/src/main.rs b/syscared/src/main.rs
index b840abf..5c60ecf 100644
--- a/syscared/src/main.rs
+++ b/syscared/src/main.rs
@@ -12,7 +12,7 @@
* See the Mulan PSL v2 for more details.
*/
-use std::{fs::Permissions, os::unix::fs::PermissionsExt, panic, process, sync::Arc};
+use std::{env, fs::Permissions, os::unix::fs::PermissionsExt, panic, process, sync::Arc};
use anyhow::{ensure, Context, Result};
use daemonize::Daemonize;
@@ -28,7 +28,7 @@ use parking_lot::RwLock;
use patch::manager::PatchManager;
use signal_hook::{consts::TERM_SIGNALS, iterator::Signals, low_level::signal_name};
-use syscare_common::{fs, os};
+use syscare_common::{concat_os, fs, os};
mod args;
mod config;
@@ -49,6 +49,9 @@ const DAEMON_VERSION: &str = env!("CARGO_PKG_VERSION");
const DAEMON_ABOUT: &str = env!("CARGO_PKG_DESCRIPTION");
const DAEMON_UMASK: u32 = 0o077;
+const PATH_ENV_NAME: &str = "PATH";
+const PATH_ENV_VALUE: &str = "/usr/libexec/syscare";
+
const CONFIG_FILE_NAME: &str = "syscared.yaml";
const PID_FILE_NAME: &str = "syscared.pid";
const SOCKET_FILE_NAME: &str = "syscared.sock";
@@ -107,6 +110,9 @@ impl Daemon {
// Initialize arguments & prepare environments
os::umask::set_umask(DAEMON_UMASK);
+ if let Some(path_env) = env::var_os(PATH_ENV_NAME) {
+ env::set_var(PATH_ENV_NAME, concat_os!(PATH_ENV_VALUE, ":", path_env));
+ }
let args = Arguments::new()?;
fs::create_dir_all(&args.config_dir)?;
diff --git a/syscared/src/patch/driver/upatch/sys.rs b/syscared/src/patch/driver/upatch/sys.rs
index a388bc6..1990289 100644
--- a/syscared/src/patch/driver/upatch/sys.rs
+++ b/syscared/src/patch/driver/upatch/sys.rs
@@ -6,7 +6,7 @@ use uuid::Uuid;
use syscare_common::process::Command;
-const UPATCH_MANAGE_BIN: &str = "/usr/libexec/syscare/upatch-manage";
+const UPATCH_MANAGE_BIN: &str = "upatch-manage";
pub fn active_patch(uuid: &Uuid, pid: i32, target_elf: &Path, patch_file: &Path) -> Result<()> {
let exit_code = Command::new(UPATCH_MANAGE_BIN)
diff --git a/upatch-build/src/main.rs b/upatch-build/src/main.rs
index b5c14a8..473b0a7 100644
--- a/upatch-build/src/main.rs
+++ b/upatch-build/src/main.rs
@@ -13,6 +13,7 @@
*/
use std::{
+ env,
ffi::OsStr,
fs::Permissions,
os::unix::fs::PermissionsExt,
@@ -54,6 +55,9 @@ const CLI_VERSION: &str = env!("CARGO_PKG_VERSION");
const CLI_ABOUT: &str = env!("CARGO_PKG_DESCRIPTION");
const CLI_UMASK: u32 = 0o022;
+const PATH_ENV_NAME: &str = "PATH";
+const PATH_ENV_VALUE: &str = "/usr/libexec/syscare";
+
const LOG_FILE_NAME: &str = "build";
struct BuildInfo {
@@ -83,6 +87,9 @@ impl UpatchBuild {
fn new() -> Result<Self> {
// Initialize arguments & prepare environments
os::umask::set_umask(CLI_UMASK);
+ if let Some(path_env) = env::var_os(PATH_ENV_NAME) {
+ env::set_var(PATH_ENV_NAME, concat_os!(PATH_ENV_VALUE, ":", path_env));
+ }
let args = Arguments::new()?;
let build_root = BuildRoot::new(&args.build_root)?;
@@ -196,7 +203,7 @@ impl UpatchBuild {
output_dir: &Path,
verbose: bool,
) -> Result<()> {
- const UPATCH_DIFF_BIN: &str = "/usr/libexec/syscare/upatch-diff";
+ const UPATCH_DIFF_BIN: &str = "upatch-diff";
let ouput_name = original_object.file_name().with_context(|| {
format!(
--
2.34.1

View File

@ -0,0 +1,901 @@
From abdafc1728b233b93c42b76034e19286e3fcbda7 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net>
Date: Tue, 21 May 2024 15:01:48 +0800
Subject: [PATCH] all: remove redundant code
Signed-off-by: renoseven <dev@renoseven.net>
---
syscare-build/src/build_root/mod.rs | 20 +-
syscare-build/src/build_root/package_root.rs | 6 -
syscare-build/src/build_root/patch_root.rs | 6 -
syscare-build/src/package/dependency.rs | 10 -
syscare-build/src/package/mod.rs | 1 -
syscare-build/src/package/rpm/mod.rs | 4 -
syscare-common/src/os/disk.rs | 64 ----
syscare-common/src/os/grub.rs | 312 ------------------
syscare-common/src/os/kernel.rs | 43 +--
syscare-common/src/os/mod.rs | 2 -
syscare-common/src/util/digest.rs | 7 -
syscared/src/fast_reboot/manager.rs | 123 -------
syscared/src/fast_reboot/mod.rs | 17 -
syscared/src/main.rs | 7 +-
syscared/src/rpc/skeleton/fast_reboot.rs | 21 --
syscared/src/rpc/skeleton/mod.rs | 2 -
syscared/src/rpc/skeleton_impl/fast_reboot.rs | 42 ---
syscared/src/rpc/skeleton_impl/mod.rs | 2 -
18 files changed, 3 insertions(+), 686 deletions(-)
delete mode 100644 syscare-build/src/package/dependency.rs
delete mode 100644 syscare-common/src/os/disk.rs
delete mode 100644 syscare-common/src/os/grub.rs
delete mode 100644 syscared/src/fast_reboot/manager.rs
delete mode 100644 syscared/src/fast_reboot/mod.rs
delete mode 100644 syscared/src/rpc/skeleton/fast_reboot.rs
delete mode 100644 syscared/src/rpc/skeleton_impl/fast_reboot.rs
diff --git a/syscare-build/src/build_root/mod.rs b/syscare-build/src/build_root/mod.rs
index 81de6b2..6a12788 100644
--- a/syscare-build/src/build_root/mod.rs
+++ b/syscare-build/src/build_root/mod.rs
@@ -12,11 +12,7 @@
* See the Mulan PSL v2 for more details.
*/
-use std::{
- ffi::OsStr,
- ops::Deref,
- path::{Path, PathBuf},
-};
+use std::path::{Path, PathBuf};
use anyhow::Result;
use syscare_common::fs;
@@ -61,17 +57,3 @@ impl BuildRoot {
Ok(())
}
}
-
-impl Deref for BuildRoot {
- type Target = Path;
-
- fn deref(&self) -> &Self::Target {
- &self.path
- }
-}
-
-impl AsRef<OsStr> for BuildRoot {
- fn as_ref(&self) -> &OsStr {
- self.as_os_str()
- }
-}
diff --git a/syscare-build/src/build_root/package_root.rs b/syscare-build/src/build_root/package_root.rs
index abb7a86..724a42b 100644
--- a/syscare-build/src/build_root/package_root.rs
+++ b/syscare-build/src/build_root/package_root.rs
@@ -50,9 +50,3 @@ impl PackageRoot {
})
}
}
-
-impl AsRef<Path> for PackageRoot {
- fn as_ref(&self) -> &Path {
- &self.path
- }
-}
diff --git a/syscare-build/src/build_root/patch_root.rs b/syscare-build/src/build_root/patch_root.rs
index b780e32..af8ec6b 100644
--- a/syscare-build/src/build_root/patch_root.rs
+++ b/syscare-build/src/build_root/patch_root.rs
@@ -44,9 +44,3 @@ impl PatchRoot {
})
}
}
-
-impl AsRef<Path> for PatchRoot {
- fn as_ref(&self) -> &Path {
- &self.path
- }
-}
diff --git a/syscare-build/src/package/dependency.rs b/syscare-build/src/package/dependency.rs
deleted file mode 100644
index 37bdf92..0000000
--- a/syscare-build/src/package/dependency.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-pub struct PackageDependency {
- requires: HashSet<String>,
- conflicts: HashSet<String>,
- suggests: HashSet<String>,
- recommends: HashSet<String>,
-}
-
-impl PackageDependency {
-
-}
\ No newline at end of file
diff --git a/syscare-build/src/package/mod.rs b/syscare-build/src/package/mod.rs
index 9ba29a1..72b555a 100644
--- a/syscare-build/src/package/mod.rs
+++ b/syscare-build/src/package/mod.rs
@@ -33,7 +33,6 @@ pub use spec_writer::*;
pub use tar::*;
trait Package {
- fn extension(&self) -> &'static str;
fn parse_package_info(&self, pkg_path: &Path) -> Result<PackageInfo>;
fn query_package_files(&self, pkg_path: &Path) -> Result<Vec<PathBuf>>;
fn extract_package(&self, pkg_path: &Path, output_dir: &Path) -> Result<()>;
diff --git a/syscare-build/src/package/rpm/mod.rs b/syscare-build/src/package/rpm/mod.rs
index 5b4bf07..0e9f77c 100644
--- a/syscare-build/src/package/rpm/mod.rs
+++ b/syscare-build/src/package/rpm/mod.rs
@@ -60,10 +60,6 @@ impl RpmPackage {
}
impl Package for RpmPackage {
- fn extension(&self) -> &'static str {
- PKG_FILE_EXT
- }
-
fn parse_package_info(&self, pkg_path: &Path) -> Result<PackageInfo> {
let query_result = Self::query_package_info(
pkg_path,
diff --git a/syscare-common/src/os/disk.rs b/syscare-common/src/os/disk.rs
deleted file mode 100644
index 7ace804..0000000
--- a/syscare-common/src/os/disk.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-// SPDX-License-Identifier: Mulan PSL v2
-/*
- * Copyright (c) 2024 Huawei Technologies Co., Ltd.
- * syscare-common is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- *
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- */
-
-use std::ffi::OsStr;
-use std::path::{Path, PathBuf};
-
-use crate::fs;
-
-#[inline(always)]
-fn find_disk<P: AsRef<Path>, S: AsRef<OsStr>>(directory: P, name: S) -> std::io::Result<PathBuf> {
- #[inline(always)]
- fn __find_disk(directory: &Path, name: &OsStr) -> std::io::Result<PathBuf> {
- let dev = fs::find_symlink(
- directory,
- name,
- fs::FindOptions {
- fuzz: false,
- recursive: false,
- },
- )?;
- fs::canonicalize(dev)
- }
-
- __find_disk(directory.as_ref(), name.as_ref()).map_err(|_| {
- std::io::Error::new(
- std::io::ErrorKind::NotFound,
- format!(
- "Cannot find block device by label \"{}\"",
- name.as_ref().to_string_lossy()
- ),
- )
- })
-}
-
-pub fn find_by_id<S: AsRef<OsStr>>(name: S) -> std::io::Result<PathBuf> {
- find_disk("/dev/disk/by-id", name)
-}
-
-pub fn find_by_label<S: AsRef<OsStr>>(name: S) -> std::io::Result<PathBuf> {
- find_disk("/dev/disk/by-label", name)
-}
-
-pub fn find_by_uuid<S: AsRef<OsStr>>(name: S) -> std::io::Result<PathBuf> {
- find_disk("/dev/disk/by-uuid", name)
-}
-
-pub fn find_by_partuuid<S: AsRef<OsStr>>(name: S) -> std::io::Result<PathBuf> {
- find_disk("/dev/disk/by-partuuid", name)
-}
-
-pub fn find_by_path<S: AsRef<OsStr>>(name: S) -> std::io::Result<PathBuf> {
- find_disk("/dev/disk/by-path", name)
-}
diff --git a/syscare-common/src/os/grub.rs b/syscare-common/src/os/grub.rs
deleted file mode 100644
index 54299d8..0000000
--- a/syscare-common/src/os/grub.rs
+++ /dev/null
@@ -1,312 +0,0 @@
-// SPDX-License-Identifier: Mulan PSL v2
-/*
- * Copyright (c) 2024 Huawei Technologies Co., Ltd.
- * syscare-common is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- *
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- */
-
-use std::collections::HashMap;
-use std::ffi::{OsStr, OsString};
-use std::io::{BufRead, BufReader};
-use std::os::unix::prelude::OsStrExt as StdOsStrExt;
-use std::path::{Path, PathBuf};
-
-use lazy_static::lazy_static;
-use log::debug;
-use regex::bytes::Regex;
-
-use super::{disk, proc_mounts};
-use crate::{
- ffi::OsStrExt,
- fs,
- io::{BufReadOsLines, OsLines},
-};
-
-#[derive(Debug, Clone, Copy)]
-enum BootType {
- Csm,
- Uefi,
-}
-
-#[derive(Debug)]
-pub struct GrubMenuEntry {
- name: OsString,
- root: PathBuf,
- kernel: PathBuf,
- initrd: PathBuf,
-}
-
-impl GrubMenuEntry {
- pub fn get_name(&self) -> &OsStr {
- &self.name
- }
-
- pub fn get_root(&self) -> &Path {
- &self.root
- }
-
- pub fn get_kernel(&self) -> PathBuf {
- // Path is stripped by regular expression, thus, it would always start with '/'
- self.root.join(self.kernel.strip_prefix("/").unwrap())
- }
-
- pub fn get_initrd(&self) -> PathBuf {
- // Path is stripped by regular expression, thus, it would always start with '/'
- self.root.join(self.initrd.strip_prefix("/").unwrap())
- }
-}
-
-struct GrubConfigParser<R> {
- lines: OsLines<R>,
- is_matching: bool,
- entry_name: Option<OsString>,
- entry_root: Option<PathBuf>,
- entry_kernel: Option<PathBuf>,
- entry_initrd: Option<PathBuf>,
-}
-
-impl<R: BufRead> GrubConfigParser<R> {
- pub fn new(buf: R) -> Self {
- Self {
- lines: buf.os_lines(),
- is_matching: false,
- entry_name: None,
- entry_root: None,
- entry_kernel: None,
- entry_initrd: None,
- }
- }
-
- #[inline(always)]
- fn parse_name(str: &OsStr) -> Option<OsString> {
- lazy_static! {
- static ref RE: Regex = Regex::new(r"'([^']*)'").unwrap();
- }
- RE.captures(str.as_bytes())
- .and_then(|captures| captures.get(1))
- .map(|matched| OsStr::from_bytes(matched.as_bytes()).to_os_string())
- }
-
- #[inline(always)]
- fn parse_uuid(str: &OsStr) -> Option<OsString> {
- str.split_whitespace()
- .filter_map(|str| {
- let arg = str.trim();
- if arg != OsStr::new("search") && !arg.starts_with("--") {
- return Some(arg.to_os_string());
- }
- None
- })
- .next()
- }
-
- #[inline(always)]
- fn parse_path(str: &OsStr) -> Option<PathBuf> {
- lazy_static! {
- static ref RE: Regex = Regex::new(r"/\.?\w+([\w\-\.])*").unwrap();
- }
- RE.find(str.as_bytes())
- .map(|matched| PathBuf::from(OsStr::from_bytes(matched.as_bytes())))
- }
-
- #[inline(always)]
- fn parse_mount_point(str: &OsStr) -> Option<PathBuf> {
- let find_dev = Self::parse_uuid(str).and_then(|uuid| disk::find_by_uuid(uuid).ok());
- if let (Some(dev_name), Ok(mounts)) = (find_dev, proc_mounts::Mounts::new()) {
- for mount in mounts {
- if mount.mount_source == dev_name {
- return Some(mount.mount_point);
- }
- }
- }
- None
- }
-}
-
-impl<R: BufRead> Iterator for GrubConfigParser<R> {
- type Item = GrubMenuEntry;
-
- fn next(&mut self) -> Option<Self::Item> {
- for line in (&mut self.lines).flatten() {
- if line.starts_with("#") {
- continue;
- }
-
- let str = line.trim();
- if str.is_empty() {
- continue;
- }
-
- if !self.is_matching {
- if str.starts_with("menuentry '") {
- self.entry_name = Self::parse_name(str);
- self.is_matching = true;
- }
- continue;
- }
- if str.starts_with("search") {
- self.entry_root = Self::parse_mount_point(str);
- } else if str.starts_with("linux") {
- self.entry_kernel = Self::parse_path(str);
- } else if str.starts_with("initrd") {
- self.entry_initrd = Self::parse_path(str);
- } else if str.starts_with("}") {
- let entry = match (
- &self.entry_name,
- &self.entry_root,
- &self.entry_kernel,
- &self.entry_initrd,
- ) {
- (Some(name), Some(root), Some(kernel), Some(initrd)) => Some(GrubMenuEntry {
- name: name.to_os_string(),
- root: root.to_path_buf(),
- kernel: kernel.to_path_buf(),
- initrd: initrd.to_path_buf(),
- }),
- _ => None,
- };
- self.is_matching = false;
- self.entry_name = None;
- self.entry_root = None;
- self.entry_kernel = None;
- self.entry_initrd = None;
-
- return entry;
- }
- }
- None
- }
-}
-
-struct GrubEnvParser<R> {
- lines: OsLines<R>,
-}
-
-impl<R: BufRead> GrubEnvParser<R> {
- pub fn new(buf: R) -> Self {
- Self {
- lines: buf.os_lines(),
- }
- }
-}
-
-impl<R: BufRead> Iterator for GrubEnvParser<R> {
- type Item = (OsString, OsString);
-
- fn next(&mut self) -> Option<Self::Item> {
- for line in (&mut self.lines).flatten() {
- if line.starts_with("#") {
- continue;
- }
-
- let str = line.trim();
- if str.is_empty() {
- continue;
- }
-
- let mut kv = line.split('=');
- if let (Some(key), Some(value)) = (kv.next(), kv.next()) {
- return Some((key.trim().to_os_string(), value.trim().to_os_string()));
- }
- }
-
- None
- }
-}
-
-fn get_boot_type() -> BootType {
- const UEFI_SYS_INTERFACE: &str = "/sys/firmware/efi";
-
- match fs::metadata(UEFI_SYS_INTERFACE) {
- Ok(_) => BootType::Uefi,
- Err(_) => BootType::Csm,
- }
-}
-
-fn get_grub_path(boot_type: BootType) -> PathBuf {
- const CSM_GRUB_PATH: &str = "/boot/grub2";
- const UEFI_GRUB_PATH: &str = "/boot/efi/EFI";
-
- match boot_type {
- BootType::Csm => PathBuf::from(CSM_GRUB_PATH),
- BootType::Uefi => PathBuf::from(UEFI_GRUB_PATH),
- }
-}
-
-fn find_grub_config<P: AsRef<Path>>(grub_root: P) -> std::io::Result<PathBuf> {
- const GRUB_CFG_NAME: &str = "grub.cfg";
-
- fs::find_file(
- grub_root,
- GRUB_CFG_NAME,
- fs::FindOptions {
- fuzz: false,
- recursive: true,
- },
- )
-}
-
-fn find_grub_env<P: AsRef<Path>>(grub_root: P) -> std::io::Result<PathBuf> {
- const GRUB_ENV_NAME: &str = "grubenv";
-
- fs::find_file(
- grub_root,
- GRUB_ENV_NAME,
- fs::FindOptions {
- fuzz: false,
- recursive: true,
- },
- )
-}
-
-pub fn read_menu_entries<P: AsRef<Path>>(grub_root: P) -> std::io::Result<Vec<GrubMenuEntry>> {
- let grub_config = find_grub_config(grub_root)?;
-
- let result = GrubConfigParser::new(BufReader::new(fs::open_file(grub_config)?)).collect();
-
- Ok(result)
-}
-
-pub fn read_grub_env<P: AsRef<Path>>(grub_root: P) -> std::io::Result<HashMap<OsString, OsString>> {
- let grub_env = find_grub_env(grub_root).unwrap();
-
- let result = GrubEnvParser::new(BufReader::new(fs::open_file(grub_env)?)).collect();
-
- Ok(result)
-}
-
-pub fn get_boot_entry() -> std::io::Result<GrubMenuEntry> {
- let boot_type = get_boot_type();
- let grub_root = get_grub_path(boot_type);
- debug!("Boot type: {:?}", boot_type);
-
- let menu_entries = read_menu_entries(&grub_root)?;
- debug!("Boot entries: {:#?}", menu_entries);
-
- let grub_env = read_grub_env(&grub_root)?;
- let default_entry_name = grub_env.get(OsStr::new("saved_entry")).ok_or_else(|| {
- std::io::Error::new(
- std::io::ErrorKind::Other,
- "Cannot read grub default entry name",
- )
- })?;
- debug!("Default entry: {:?}", default_entry_name);
-
- for entry in menu_entries {
- if entry.get_name() == default_entry_name {
- return Ok(entry);
- }
- }
-
- Err(std::io::Error::new(
- std::io::ErrorKind::Other,
- format!("Cannot find grub default entry {:?}", default_entry_name),
- ))
-}
diff --git a/syscare-common/src/os/kernel.rs b/syscare-common/src/os/kernel.rs
index b89850b..a29e663 100644
--- a/syscare-common/src/os/kernel.rs
+++ b/syscare-common/src/os/kernel.rs
@@ -12,51 +12,10 @@
* See the Mulan PSL v2 for more details.
*/
-use std::{ffi::OsStr, path::Path};
-
-use anyhow::Result;
-
-const KEXEC_PATH: &str = "kexec";
-const SYSTEMCTL_PATH: &str = "systemctl";
+use std::ffi::OsStr;
use super::platform;
-use crate::{concat_os, process::Command};
pub fn version() -> &'static OsStr {
platform::release()
}
-
-pub fn load<P, Q>(kernel: P, initramfs: Q) -> Result<()>
-where
- P: AsRef<Path>,
- Q: AsRef<Path>,
-{
- Command::new(KEXEC_PATH)
- .arg("--load")
- .arg(kernel.as_ref())
- .arg(concat_os!("--initrd=", initramfs.as_ref()))
- .arg("--reuse-cmdline")
- .run_with_output()?
- .exit_ok()
-}
-
-pub fn unload() -> Result<()> {
- Command::new(KEXEC_PATH)
- .arg("--unload")
- .run_with_output()?
- .exit_ok()
-}
-
-pub fn systemd_exec() -> Result<()> {
- Command::new(SYSTEMCTL_PATH)
- .arg("kexec")
- .run_with_output()?
- .exit_ok()
-}
-
-pub fn force_exec() -> Result<()> {
- Command::new(KEXEC_PATH)
- .arg("--exec")
- .run_with_output()?
- .exit_ok()
-}
diff --git a/syscare-common/src/os/mod.rs b/syscare-common/src/os/mod.rs
index 8e6d5c1..6a93a20 100644
--- a/syscare-common/src/os/mod.rs
+++ b/syscare-common/src/os/mod.rs
@@ -13,8 +13,6 @@
*/
pub mod cpu;
-pub mod disk;
-pub mod grub;
pub mod kernel;
pub mod platform;
pub mod proc_maps;
diff --git a/syscare-common/src/util/digest.rs b/syscare-common/src/util/digest.rs
index bb879cb..086b636 100644
--- a/syscare-common/src/util/digest.rs
+++ b/syscare-common/src/util/digest.rs
@@ -45,10 +45,3 @@ where
Ok(format!("{:#x}", hasher.finalize()))
}
-
-pub fn dir<P: AsRef<Path>>(directory: P) -> std::io::Result<String> {
- file_list(fs::list_files(
- directory,
- fs::TraverseOptions { recursive: true },
- )?)
-}
diff --git a/syscared/src/fast_reboot/manager.rs b/syscared/src/fast_reboot/manager.rs
deleted file mode 100644
index 8a4a928..0000000
--- a/syscared/src/fast_reboot/manager.rs
+++ /dev/null
@@ -1,123 +0,0 @@
-// SPDX-License-Identifier: Mulan PSL v2
-/*
- * Copyright (c) 2024 Huawei Technologies Co., Ltd.
- * syscared is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- *
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- */
-
-use std::path::PathBuf;
-
-use anyhow::{Context, Result};
-use lazy_static::lazy_static;
-use log::{error, info};
-
-use syscare_common::{
- fs,
- os::{grub, kernel},
-};
-
-lazy_static! {
- static ref BOOT_DIRECTORY: PathBuf = PathBuf::from("/boot");
-}
-
-pub enum RebootOption {
- Normal,
- Forced,
-}
-
-struct LoadKernelOption {
- name: String,
- kernel: PathBuf,
- initramfs: PathBuf,
-}
-
-pub struct KExecManager;
-
-impl KExecManager {
- fn find_kernel(kernel_version: &str) -> Result<LoadKernelOption> {
- info!("Finding kernel {}...", kernel_version);
- let kernel_file_name = format!("vmlinuz-{}", kernel_version);
- let kernel_file = fs::find_file(
- BOOT_DIRECTORY.as_path(),
- kernel_file_name,
- fs::FindOptions {
- fuzz: false,
- recursive: false,
- },
- )
- .with_context(|| format!("Cannot find kernel {}", kernel_version))?;
-
- info!("Finding initramfs...");
- let initramfs_file_name = format!("initramfs-{}.img", kernel_version);
- let initramfs_file = fs::find_file(
- BOOT_DIRECTORY.as_path(),
- initramfs_file_name,
- fs::FindOptions {
- fuzz: false,
- recursive: false,
- },
- )
- .with_context(|| format!("Cannot find kernel {} initramfs", kernel_version))?;
-
- Ok(LoadKernelOption {
- name: kernel_version.to_owned(),
- kernel: kernel_file,
- initramfs: initramfs_file,
- })
- }
-
- fn find_kernel_by_grub() -> Result<LoadKernelOption> {
- info!("Parsing grub configuration...");
- let entry = grub::get_boot_entry().context("Failed to read grub boot entry")?;
- let entry_name = entry
- .get_name()
- .to_str()
- .context("Failed to parse grub entry name")?;
-
- Ok(LoadKernelOption {
- name: entry_name.to_owned(),
- kernel: entry.get_kernel(),
- initramfs: entry.get_initrd(),
- })
- }
-
- pub fn load_kernel(kernel_version: Option<String>) -> Result<()> {
- let load_option = match kernel_version {
- Some(version) => Self::find_kernel(&version),
- None => Self::find_kernel_by_grub().or_else(|e| {
- error!("{:?}", e);
- let version: &str = kernel::version()
- .to_str()
- .context("Failed to parse current kernel version")?;
-
- Self::find_kernel(version)
- }),
- }?;
-
- kernel::unload().context("Failed to unload kernel")?;
-
- let name = load_option.name;
- let kernel = load_option.kernel;
- let initramfs = load_option.initramfs;
- info!("Loading {:?}", name);
- info!("Using kernel: {:?}", kernel);
- info!("Using initrd: {:?}", initramfs);
-
- kernel::load(&kernel, &initramfs).context("Failed to load kernel")
- }
-
- pub fn execute(option: RebootOption) -> Result<()> {
- match option {
- RebootOption::Normal => kernel::systemd_exec(),
- RebootOption::Forced => kernel::force_exec(),
- }
- .context("Failed to execute kernel")
- }
-}
diff --git a/syscared/src/fast_reboot/mod.rs b/syscared/src/fast_reboot/mod.rs
deleted file mode 100644
index 8c40eb9..0000000
--- a/syscared/src/fast_reboot/mod.rs
+++ /dev/null
@@ -1,17 +0,0 @@
-// SPDX-License-Identifier: Mulan PSL v2
-/*
- * Copyright (c) 2024 Huawei Technologies Co., Ltd.
- * syscared is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- *
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- */
-
-mod manager;
-
-pub use manager::*;
diff --git a/syscared/src/main.rs b/syscared/src/main.rs
index 5c60ecf..f13a9f8 100644
--- a/syscared/src/main.rs
+++ b/syscared/src/main.rs
@@ -32,17 +32,13 @@ use syscare_common::{concat_os, fs, os};
mod args;
mod config;
-mod fast_reboot;
mod patch;
mod rpc;
use args::Arguments;
use config::Config;
use patch::monitor::PatchMonitor;
-use rpc::{
- skeleton::{FastRebootSkeleton, PatchSkeleton},
- skeleton_impl::{FastRebootSkeletonImpl, PatchSkeletonImpl},
-};
+use rpc::{skeleton::PatchSkeleton, skeleton_impl::PatchSkeletonImpl};
const DAEMON_NAME: &str = env!("CARGO_PKG_NAME");
const DAEMON_VERSION: &str = env!("CARGO_PKG_VERSION");
@@ -195,7 +191,6 @@ impl Daemon {
let mut io_handler = IoHandler::new();
io_handler.extend_with(PatchSkeletonImpl::new(patch_manager).to_delegate());
- io_handler.extend_with(FastRebootSkeletonImpl.to_delegate());
Ok(io_handler)
}
diff --git a/syscared/src/rpc/skeleton/fast_reboot.rs b/syscared/src/rpc/skeleton/fast_reboot.rs
deleted file mode 100644
index 1a7b496..0000000
--- a/syscared/src/rpc/skeleton/fast_reboot.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-// SPDX-License-Identifier: Mulan PSL v2
-/*
- * Copyright (c) 2024 Huawei Technologies Co., Ltd.
- * syscared is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- *
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- */
-
-use super::function::{rpc, RpcResult};
-
-#[rpc(server)]
-pub trait FastRebootSkeleton {
- #[rpc(name = "fast_reboot")]
- fn fast_reboot(&self, kernel_version: Option<String>, force: bool) -> RpcResult<()>;
-}
diff --git a/syscared/src/rpc/skeleton/mod.rs b/syscared/src/rpc/skeleton/mod.rs
index 74456ca..6fa6b60 100644
--- a/syscared/src/rpc/skeleton/mod.rs
+++ b/syscared/src/rpc/skeleton/mod.rs
@@ -14,8 +14,6 @@
use super::function;
-mod fast_reboot;
mod patch;
-pub use fast_reboot::*;
pub use patch::*;
diff --git a/syscared/src/rpc/skeleton_impl/fast_reboot.rs b/syscared/src/rpc/skeleton_impl/fast_reboot.rs
deleted file mode 100644
index aeab458..0000000
--- a/syscared/src/rpc/skeleton_impl/fast_reboot.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-// SPDX-License-Identifier: Mulan PSL v2
-/*
- * Copyright (c) 2024 Huawei Technologies Co., Ltd.
- * syscared is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- *
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- */
-
-use anyhow::{Context, Result};
-
-use crate::fast_reboot::{KExecManager, RebootOption};
-use log::info;
-
-use super::{
- function::{RpcFunction, RpcResult},
- skeleton::FastRebootSkeleton,
-};
-
-pub struct FastRebootSkeletonImpl;
-
-impl FastRebootSkeleton for FastRebootSkeletonImpl {
- fn fast_reboot(&self, kernel_version: Option<String>, force: bool) -> RpcResult<()> {
- RpcFunction::call(move || -> Result<()> {
- info!("Rebooting system...");
-
- KExecManager::load_kernel(kernel_version)
- .and_then(|_| {
- KExecManager::execute(match force {
- true => RebootOption::Forced,
- false => RebootOption::Normal,
- })
- })
- .context("Failed to reboot system")
- })
- }
-}
diff --git a/syscared/src/rpc/skeleton_impl/mod.rs b/syscared/src/rpc/skeleton_impl/mod.rs
index a238df4..7037946 100644
--- a/syscared/src/rpc/skeleton_impl/mod.rs
+++ b/syscared/src/rpc/skeleton_impl/mod.rs
@@ -15,8 +15,6 @@
use super::function;
use super::skeleton;
-mod fast_reboot;
mod patch;
-pub use fast_reboot::*;
pub use patch::*;
--
2.34.1

View File

@ -0,0 +1,37 @@
From c22716401d7f76ba6bccfa5ee2cbb694d298d385 Mon Sep 17 00:00:00 2001
From: liuxiaobo <liuxiaobo19@huawei.com>
Date: Fri, 31 May 2024 17:18:16 +0800
Subject: [PATCH] abi: reexport uuid
Signed-off-by: liuxiaobo <liuxiaobo19@huawei.com>
---
syscare-abi/Cargo.toml | 2 +-
syscare-abi/src/lib.rs | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/syscare-abi/Cargo.toml b/syscare-abi/Cargo.toml
index f086850..a3af2be 100644
--- a/syscare-abi/Cargo.toml
+++ b/syscare-abi/Cargo.toml
@@ -10,4 +10,4 @@ build = "build.rs"
[dependencies]
serde = { version = "1.0", features = ["derive"] }
-uuid = { version = "0.8", features = ["v4"] }
+uuid = { version = "0.8", features = ["v4", "serde"] }
diff --git a/syscare-abi/src/lib.rs b/syscare-abi/src/lib.rs
index 6600099..881587c 100644
--- a/syscare-abi/src/lib.rs
+++ b/syscare-abi/src/lib.rs
@@ -12,6 +12,8 @@
* See the Mulan PSL v2 for more details.
*/
+pub use uuid::Uuid;
+
mod package_info;
mod patch_info;
mod patch_status;
--
2.34.1

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
From f913658fd6746bb59df82e0c564b664592e71c87 Mon Sep 17 00:00:00 2001
From: liuxiaobo <liuxiaobo19@huawei.com>
Date: Wed, 5 Jun 2024 10:52:44 +0800
Subject: [PATCH] common: fix 'failed to set selinux status' issue
Signed-off-by: liuxiaobo <liuxiaobo19@huawei.com>
---
syscare-common/src/os/selinux.rs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/syscare-common/src/os/selinux.rs b/syscare-common/src/os/selinux.rs
index cf3b5b2..bb9864c 100644
--- a/syscare-common/src/os/selinux.rs
+++ b/syscare-common/src/os/selinux.rs
@@ -59,7 +59,13 @@ pub fn set_status(value: Status) -> Result<()> {
if (value != Status::Permissive) && (value != Status::Enforcing) {
bail!("Status {} is invalid", value);
}
- fs::write(SELINUX_SYS_FILE, value.to_string())?;
+ fs::write(
+ SELINUX_SYS_FILE,
+ match value {
+ Status::Enforcing => "1",
+ _ => "0",
+ },
+ )?;
Ok(())
}
--
2.34.1

View File

@ -0,0 +1,48 @@
From 7e17420b259d6a25425230cd1cc25bfaf602f1df Mon Sep 17 00:00:00 2001
From: ningyu <ningyu9@huawei.com>
Date: Mon, 27 May 2024 10:34:00 +0000
Subject: [PATCH] upatch-diff: exit with error when any tls var included
Signed-off-by: ningyu <ningyu9@huawei.com>
---
upatch-diff/create-diff-object.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/upatch-diff/create-diff-object.c b/upatch-diff/create-diff-object.c
index 6474b22..5ec6f31 100644
--- a/upatch-diff/create-diff-object.c
+++ b/upatch-diff/create-diff-object.c
@@ -847,6 +847,19 @@ static void include_debug_sections(struct upatch_elf *uelf)
/* currently, there si no special section need to be handled */
static void process_special_sections(void) {}
+static bool has_tls_included(struct upatch_elf *uelf)
+{
+ struct symbol *sym;
+
+ list_for_each_entry(sym, &uelf->symbols, list) {
+ if (sym->include == 1 && sym->type == STT_TLS) {
+ log_normal("TLS symbol '%s' included, but it's not supported", sym->name);
+ return true;
+ }
+ }
+ return false;
+}
+
static void verify_patchability(struct upatch_elf *uelf)
{
struct section *sec;
@@ -878,6 +891,10 @@ static void verify_patchability(struct upatch_elf *uelf)
if (errs)
DIFF_FATAL("%d, Unsupported section changes", errs);
+
+ if (has_tls_included(uelf)) {
+ DIFF_FATAL("Unsupported symbol included");
+ }
}
static void migrate_included_elements(struct upatch_elf *uelf_patched, struct upatch_elf *uelf_out)
--
2.34.1

View File

@ -0,0 +1,34 @@
From 8a12d289a01988ec7e2de11ff7f697f63ef74987 Mon Sep 17 00:00:00 2001
From: ningyu <ningyu9@huawei.com>
Date: Mon, 27 May 2024 11:16:26 +0000
Subject: [PATCH] upatch-diff: fix lookup_relf duplicate failure
Signed-off-by: ningyu <ningyu9@huawei.com>
---
upatch-diff/running-elf.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/upatch-diff/running-elf.c b/upatch-diff/running-elf.c
index 25b72b7..18ff095 100644
--- a/upatch-diff/running-elf.c
+++ b/upatch-diff/running-elf.c
@@ -125,9 +125,15 @@ bool lookup_relf(struct running_elf *relf,
symbol = &relf->obj_syms[i];
sympos++;
- if (strcmp(symbol->name, lookup_sym->name) != 0) {
+ if (result->symbol != NULL && symbol->type == STT_FILE) {
+ break;
+ }
+
+ if (strcmp(symbol->name, lookup_sym->name) != 0 ||
+ symbol->bind != lookup_sym->bind) {
continue;
}
+
if ((result->symbol != NULL) &&
(result->symbol->bind == symbol->bind)) {
ERROR("Found duplicate symbol '%s' in %s",
--
2.34.1

View File

@ -0,0 +1,611 @@
From e6eef4077acbff6e43e3c3880fb57d64b73e2567 Mon Sep 17 00:00:00 2001
From: liuxiaobo <liuxiaobo19@huawei.com>
Date: Thu, 27 Jun 2024 14:22:53 +0800
Subject: [PATCH] upatch-diff: fix memory leak
Signed-off-by: liuxiaobo <liuxiaobo19@huawei.com>
---
upatch-diff/create-diff-object.c | 34 +++++---
upatch-diff/elf-correlate.c | 10 +--
upatch-diff/elf-create.c | 83 ++++++++++++--------
upatch-diff/elf-debug.c | 7 +-
upatch-diff/running-elf.c | 2 +-
upatch-diff/running-elf.h | 2 +-
upatch-diff/upatch-elf.c | 128 ++++++++++++++++++++++---------
upatch-diff/upatch-elf.h | 14 +++-
8 files changed, 191 insertions(+), 89 deletions(-)
diff --git a/upatch-diff/create-diff-object.c b/upatch-diff/create-diff-object.c
index 5ec6f31..8830956 100644
--- a/upatch-diff/create-diff-object.c
+++ b/upatch-diff/create-diff-object.c
@@ -836,8 +836,10 @@ static void include_debug_sections(struct upatch_elf *uelf)
list_for_each_entry_safe(rela, saferela, &sec->relas, list)
// The shndex of symbol is SHN_COMMON, there is no related section
- if (rela->sym && !rela->sym->include)
+ if (rela->sym && !rela->sym->include) {
list_del(&rela->list);
+ free(rela);
+ }
}
if (eh_sec)
@@ -993,15 +995,20 @@ int main(int argc, char*argv[])
mark_ignored_functions_same();
mark_ignored_sections_same();
- upatch_elf_teardown(&uelf_source);
- upatch_elf_free(&uelf_source);
-
include_standard_elements(&uelf_patched);
num_changed = include_changed_functions(&uelf_patched);
new_globals_exist = include_new_globals(&uelf_patched);
if (!num_changed && !new_globals_exist) {
log_normal("No functional changes\n");
+ upatch_elf_destroy(&uelf_source);
+ upatch_elf_destroy(&uelf_patched);
+
+ upatch_elf_close(&uelf_source);
+ upatch_elf_close(&uelf_patched);
+
+ relf_close(&relf);
+
return 0;
}
@@ -1019,9 +1026,6 @@ int main(int argc, char*argv[])
migrate_included_elements(&uelf_patched, &uelf_out);
- /* since out elf still point to it, we only destroy it, not free it */
- upatch_elf_teardown(&uelf_patched);
-
upatch_create_strings_elements(&uelf_out);
upatch_create_patches_sections(&uelf_out, &relf);
@@ -1060,11 +1064,19 @@ int main(int argc, char*argv[])
upatch_write_output_elf(&uelf_out, uelf_patched.elf, arguments.output_obj, 0664);
- relf_destroy(&relf);
- upatch_elf_free(&uelf_patched);
- upatch_elf_teardown(&uelf_out);
- upatch_elf_free(&uelf_out);
+ upatch_elf_destroy(&uelf_source);
+ upatch_elf_destroy(&uelf_patched);
+ upatch_elf_destroy(&uelf_out);
+
+ upatch_elf_close(&uelf_source);
+ upatch_elf_close(&uelf_patched);
+ upatch_elf_close(&uelf_out);
+
+ relf_close(&relf);
log_normal("Done\n");
+ fflush(stdout);
+ fflush(stderr);
+
return 0;
}
diff --git a/upatch-diff/elf-correlate.c b/upatch-diff/elf-correlate.c
index 3e3a536..cc3b925 100644
--- a/upatch-diff/elf-correlate.c
+++ b/upatch-diff/elf-correlate.c
@@ -36,9 +36,8 @@ static void correlate_symbol(struct symbol *sym_orig, struct symbol *sym_patched
sym_orig->status = sym_patched->status = SAME;
if (strcmp(sym_orig->name, sym_patched->name)) {
log_debug("renaming symbol %s to %s \n", sym_patched->name, sym_orig->name);
- sym_patched->name = strdup(sym_orig->name);
- if (!sym_patched->name)
- ERROR("strdup");
+ sym_patched->name = sym_orig->name;
+ sym_patched->name_source = DATA_SOURCE_REF;
}
if (sym_orig->relf_sym && !sym_patched->relf_sym)
sym_patched->relf_sym = sym_orig->relf_sym;
@@ -98,9 +97,8 @@ static void __correlate_section(struct section *sec_orig, struct section *sec_pa
/* Make sure these two sections have the same name */
if (strcmp(sec_orig->name, sec_patched->name)) {
log_debug("renaming section %s to %s \n", sec_patched->name, sec_orig->name);
- sec_patched->name = strdup(sec_orig->name);
- if (!sec_patched->name)
- ERROR("strdup");
+ sec_patched->name = sec_orig->name;
+ sec_patched->name_source = DATA_SOURCE_REF;
}
}
diff --git a/upatch-diff/elf-create.c b/upatch-diff/elf-create.c
index 8ac212a..bd7edf0 100644
--- a/upatch-diff/elf-create.c
+++ b/upatch-diff/elf-create.c
@@ -41,10 +41,12 @@ static struct section *create_section_pair(struct upatch_elf *uelf, char *name,
{
char *relaname;
struct section *sec, *relasec;
+ size_t size = strlen(name) + strlen(".rela") + 1;
- relaname = malloc(strlen(name) + strlen(".rela") + 1);
- if (!relaname)
+ relaname = calloc(1, size);
+ if (!relaname) {
ERROR("relaname malloc failed.");
+ }
strcpy(relaname, ".rela");
strcat(relaname, name);
@@ -52,13 +54,17 @@ static struct section *create_section_pair(struct upatch_elf *uelf, char *name,
/* allocate text section resourcce */
ALLOC_LINK(sec, &uelf->sections);
sec->name = name;
- sec->data = malloc(sizeof(*sec->data));
- if (!sec->data)
+ sec->data = calloc(1, sizeof(Elf_Data));
+ if (!sec->data) {
ERROR("section data malloc failed.");
+ }
+ sec->data_source = DATA_SOURCE_ALLOC;
sec->data->d_buf = calloc(nr, entsize);
- if (!sec->data->d_buf)
+ if (!sec->data->d_buf) {
ERROR("d_buf of section data malloc failed.");
+ }
+ sec->dbuf_source = DATA_SOURCE_ALLOC;
sec->data->d_size = entsize * nr;
sec->data->d_type = ELF_T_BYTE;
@@ -73,12 +79,15 @@ static struct section *create_section_pair(struct upatch_elf *uelf, char *name,
/* set relocation section */
ALLOC_LINK(relasec, &uelf->sections);
relasec->name = relaname;
+ relasec->name_source = DATA_SOURCE_ALLOC;
INIT_LIST_HEAD(&relasec->relas);
/* buffers will be generated by upatch_rebuild_rela_section_data */
- relasec->data = malloc(sizeof(*relasec->data));
- if (!relasec->data)
+ relasec->data = calloc(1, sizeof(Elf_Data));
+ if (!relasec->data) {
ERROR("relasec data malloc failed.");
+ }
+ relasec->data_source = DATA_SOURCE_ALLOC;
relasec->data->d_type = ELF_T_RELA;
@@ -103,9 +112,12 @@ void upatch_create_strings_elements(struct upatch_elf *uelf)
ALLOC_LINK(sec, &uelf->sections);
sec->name = ".upatch.strings";
- sec->data = malloc(sizeof(*sec->data));
- if (!sec->data)
+ sec->data = calloc(1, sizeof(Elf_Data));
+ if (!sec->data) {
ERROR("section data malloc failed");
+ }
+ sec->data_source = DATA_SOURCE_ALLOC;
+
sec->data->d_type = ELF_T_BYTE;
/* set section header */
@@ -310,12 +322,14 @@ void upatch_build_strings_section_data(struct upatch_elf *uelf)
size += strlen(string->name) + 1;
/* allocate section resources */
- strtab = malloc(size);
- if (!strtab)
+ strtab = calloc(1, size);
+ if (!strtab) {
ERROR("strtab malloc failed.");
+ }
sec->data->d_buf = strtab;
sec->data->d_size = size;
+ sec->dbuf_source = DATA_SOURCE_ALLOC;
/* populate strings section data */
list_for_each_entry(string, &uelf->strings, list) {
@@ -407,13 +421,15 @@ static void rebuild_rela_section_data(struct section *sec)
nr++;
size = nr * sizeof(*relas);
- relas = malloc(size);
- if (!relas)
+ relas = calloc(1, size);
+ if (!relas) {
ERROR("relas malloc failed.");
+ }
sec->data->d_buf = relas;
sec->data->d_size = size;
sec->sh.sh_size = size;
+ sec->dbuf_source = DATA_SOURCE_ALLOC;
list_for_each_entry(rela, &sec->relas, list) {
relas[index].r_offset = rela->offset;
@@ -469,18 +485,19 @@ void upatch_create_shstrtab(struct upatch_elf *uelf)
char *buf;
shstrtab = find_section_by_name(&uelf->sections, ".shstrtab");
- if (!shstrtab)
+ if (!shstrtab) {
ERROR("find_section_by_name failed.");
+ }
/* determine size of string table */
size = 1;
list_for_each_entry(sec, &uelf->sections, list)
size += strlen(sec->name) + 1;
- buf = malloc(size);
- if (!buf)
+ buf = calloc(1, size);
+ if (!buf) {
ERROR("malloc shstrtab failed.");
- memset(buf, 0, size);
+ }
offset = 1;
list_for_each_entry(sec, &uelf->sections, list) {
@@ -490,11 +507,14 @@ void upatch_create_shstrtab(struct upatch_elf *uelf)
offset += len;
}
- if (offset != size)
+ if (offset != size) {
+ free(buf);
ERROR("shstrtab size mismatch.");
+ }
shstrtab->data->d_buf = buf;
shstrtab->data->d_size = size;
+ shstrtab->dbuf_source = DATA_SOURCE_ALLOC;
log_debug("shstrtab: ");
print_strtab(buf, size);
@@ -506,25 +526,24 @@ void upatch_create_shstrtab(struct upatch_elf *uelf)
void upatch_create_strtab(struct upatch_elf *uelf)
{
- struct section *strtab;
- struct symbol *sym;
size_t size = 0, offset = 0, len = 0;
- char *buf;
- strtab = find_section_by_name(&uelf->sections, ".strtab");
- if (!strtab)
+ struct section *strtab = find_section_by_name(&uelf->sections, ".strtab");
+ if (!strtab) {
ERROR("find section failed in create strtab.");
+ }
+ struct symbol *sym = NULL;
list_for_each_entry(sym, &uelf->symbols, list) {
if (sym->type == STT_SECTION)
continue;
size += strlen(sym->name) + 1;
}
- buf = malloc(size);
- if (!buf)
+ char *buf = calloc(1, size);
+ if (!buf) {
ERROR("malloc buf failed in create strtab");
- memset(buf, 0, size);
+ }
list_for_each_entry(sym, &uelf->symbols, list) {
if (sym->type == STT_SECTION) {
@@ -537,11 +556,14 @@ void upatch_create_strtab(struct upatch_elf *uelf)
offset += len;
}
- if (offset != size)
+ if (offset != size) {
+ free(buf);
ERROR("shstrtab size mismatch.");
+ }
strtab->data->d_buf = buf;
strtab->data->d_size = size;
+ strtab->dbuf_source = DATA_SOURCE_ALLOC;
log_debug("strtab: ");
print_strtab(buf, size);
@@ -569,10 +591,10 @@ void upatch_create_symtab(struct upatch_elf *uelf)
nr++;
size = nr * symtab->sh.sh_entsize;
- buf = malloc(size);
- if (!buf)
+ buf = calloc(1, size);
+ if (!buf) {
ERROR("malloc buf failed in create symtab.");
- memset(buf, 0, size);
+ }
offset = 0;
list_for_each_entry(sym, &uelf->symbols, list) {
@@ -585,6 +607,7 @@ void upatch_create_symtab(struct upatch_elf *uelf)
symtab->data->d_buf = buf;
symtab->data->d_size = size;
+ symtab->dbuf_source = DATA_SOURCE_ALLOC;
/* update symtab section header */
strtab = find_section_by_name(&uelf->sections, ".strtab");
diff --git a/upatch-diff/elf-debug.c b/upatch-diff/elf-debug.c
index eaabfa1..0490f86 100644
--- a/upatch-diff/elf-debug.c
+++ b/upatch-diff/elf-debug.c
@@ -129,9 +129,10 @@ void upatch_rebuild_eh_frame(struct section *sec)
/* in this time, some relcation entries may have been deleted */
frame_size = 0;
- eh_frame = malloc(sec->data->d_size);
- if (!eh_frame)
+ eh_frame = calloc(1, sec->data->d_size);
+ if (!eh_frame) {
ERROR("malloc eh_frame failed \n");
+ }
/* 8 is the offset of PC begin */
current_offset = 8;
@@ -191,5 +192,7 @@ void upatch_rebuild_eh_frame(struct section *sec)
sec->data->d_buf = eh_frame;
sec->data->d_size = frame_size;
+ sec->dbuf_source = DATA_SOURCE_ALLOC;
+
sec->sh.sh_size = frame_size;
}
diff --git a/upatch-diff/running-elf.c b/upatch-diff/running-elf.c
index 18ff095..c99b395 100644
--- a/upatch-diff/running-elf.c
+++ b/upatch-diff/running-elf.c
@@ -101,7 +101,7 @@ void relf_init(char *elf_name, struct running_elf *relf)
}
}
-int relf_destroy(struct running_elf *relf)
+int relf_close(struct running_elf *relf)
{
free(relf->obj_syms);
elf_end(relf->elf);
diff --git a/upatch-diff/running-elf.h b/upatch-diff/running-elf.h
index 0646780..b02c8e2 100644
--- a/upatch-diff/running-elf.h
+++ b/upatch-diff/running-elf.h
@@ -58,7 +58,7 @@ struct running_elf {
void relf_init(char *, struct running_elf *);
-int relf_destroy(struct running_elf *);
+int relf_close(struct running_elf *);
bool lookup_relf(struct running_elf *, struct symbol *, struct lookup_result *);
diff --git a/upatch-diff/upatch-elf.c b/upatch-diff/upatch-elf.c
index ee38efc..171e88e 100644
--- a/upatch-diff/upatch-elf.c
+++ b/upatch-diff/upatch-elf.c
@@ -67,11 +67,14 @@ static void create_section_list(struct upatch_elf *uelf)
sec->name = elf_strptr(uelf->elf, shstrndx, sec->sh.sh_name);
if (!sec->name)
ERROR("elf_strptr with error %s", elf_errmsg(0));
-
sec->data = elf_getdata(scn, NULL);
if (!sec->data)
ERROR("elf_getdata with error %s", elf_errmsg(0));
+ sec->name_source = DATA_SOURCE_ELF;
+ sec->data_source = DATA_SOURCE_ELF;
+ sec->dbuf_source = DATA_SOURCE_ELF;
+
sec->index = (unsigned int)elf_ndxscn(scn);
/* found extended section header */
if (sec->sh.sh_type == SHT_SYMTAB_SHNDX)
@@ -157,6 +160,8 @@ static void create_rela_list(struct upatch_elf *uelf, struct section *relasec)
struct rela *rela;
int index = 0, skip = 0;
+ INIT_LIST_HEAD(&relasec->relas);
+
/* for relocation sections, sh_info is the index which these informations apply */
relasec->base = find_section_by_index(&uelf->sections, relasec->sh.sh_info);
if (!relasec->base)
@@ -215,10 +220,86 @@ static void create_rela_list(struct upatch_elf *uelf, struct section *relasec)
}
}
+static void destroy_rela_list(struct section *relasec)
+{
+ struct rela *rela = NULL, *saferela = NULL;
+
+ list_for_each_entry_safe(rela, saferela, &relasec->relas, list) {
+ list_del(&rela->list);
+ free(rela);
+ }
+
+ INIT_LIST_HEAD(&relasec->relas);
+}
+
+static void destroy_section_list(struct upatch_elf *uelf)
+{
+ struct section *sec = NULL, *safesec = NULL;
+
+ list_for_each_entry_safe(sec, safesec, &uelf->sections, list) {
+ if (sec->twin) {
+ sec->twin->twin = NULL;
+ }
+
+ if ((sec->name != NULL) && (sec->name_source == DATA_SOURCE_ALLOC)) {
+ free(sec->name);
+ sec->name = NULL;
+ }
+
+ if (sec->data != NULL) {
+ if (sec->dbuf_source == DATA_SOURCE_ALLOC) {
+ free(sec->data->d_buf);
+ sec->data->d_buf = NULL;
+ }
+ if (sec->data_source == DATA_SOURCE_ALLOC) {
+ free(sec->data);
+ sec->data = NULL;
+ }
+ }
+
+ if (is_rela_section(sec)) {
+ destroy_rela_list(sec);
+ }
+
+ list_del(&sec->list);
+ free(sec);
+ }
+
+ INIT_LIST_HEAD(&uelf->sections);
+}
+
+static void destroy_symbol_list(struct upatch_elf *uelf)
+{
+ struct symbol *sym = NULL, *safesym = NULL;
+
+ list_for_each_entry_safe(sym, safesym, &uelf->symbols, list) {
+ if (sym->twin) {
+ sym->twin->twin = NULL;
+ }
+
+ list_del(&sym->list);
+ free(sym);
+ }
+
+ INIT_LIST_HEAD(&uelf->symbols);
+}
+
+static void destroy_string_list(struct upatch_elf *uelf)
+{
+ struct string *str = NULL, *safestr = NULL;
+
+ list_for_each_entry_safe(str, safestr, &uelf->strings, list) {
+ list_del(&str->list);
+ free(str);
+ }
+
+ INIT_LIST_HEAD(&uelf->strings);
+}
+
void upatch_elf_open(struct upatch_elf *uelf, const char *name)
{
GElf_Ehdr ehdr;
- struct section *relasec;
+ struct section *sec;
Elf *elf = NULL;
int fd = 1;
@@ -264,46 +345,21 @@ void upatch_elf_open(struct upatch_elf *uelf, const char *name)
create_section_list(uelf);
create_symbol_list(uelf);
- list_for_each_entry(relasec, &uelf->sections, list) {
- if (!is_rela_section(relasec))
- continue;
- INIT_LIST_HEAD(&relasec->relas);
-
- create_rela_list(uelf, relasec);
- }
-}
-
-void upatch_elf_teardown(struct upatch_elf *uelf)
-{
- struct section *sec, *safesec;
- struct symbol *sym, *safesym;
- struct rela *rela, *saferela;
-
- list_for_each_entry_safe(sec, safesec, &uelf->sections, list) {
- if (sec->twin)
- sec->twin->twin = NULL;
+ list_for_each_entry(sec, &uelf->sections, list) {
if (is_rela_section(sec)) {
- list_for_each_entry_safe(rela, saferela, &sec->relas, list) {
- memset(rela, 0, sizeof(*rela));
- free(rela);
- }
+ create_rela_list(uelf, sec);
}
- memset(sec, 0, sizeof(*sec));
- free(sec);
- }
-
- list_for_each_entry_safe(sym, safesym, &uelf->symbols, list) {
- if (sym->twin)
- sym->twin->twin = NULL;
- memset(sym, 0, sizeof(*sym));
- free(sym);
}
+}
- INIT_LIST_HEAD(&uelf->sections);
- INIT_LIST_HEAD(&uelf->symbols);
+void upatch_elf_destroy(struct upatch_elf *uelf)
+{
+ destroy_section_list(uelf);
+ destroy_symbol_list(uelf);
+ destroy_string_list(uelf);
}
-void upatch_elf_free(struct upatch_elf *uelf)
+void upatch_elf_close(struct upatch_elf *uelf)
{
elf_end(uelf->elf);
close(uelf->fd);
diff --git a/upatch-diff/upatch-elf.h b/upatch-diff/upatch-elf.h
index 3cbb59b..6c62c93 100644
--- a/upatch-diff/upatch-elf.h
+++ b/upatch-diff/upatch-elf.h
@@ -39,6 +39,12 @@ struct section;
struct rela;
struct symbol;
+enum data_source {
+ DATA_SOURCE_ELF,
+ DATA_SOURCE_REF,
+ DATA_SOURCE_ALLOC,
+};
+
enum status {
NEW,
CHANGED,
@@ -61,6 +67,9 @@ struct section {
struct section *twin;
char *name;
Elf_Data *data;
+ enum data_source name_source;
+ enum data_source data_source;
+ enum data_source dbuf_source;
GElf_Shdr sh;
int ignore;
int include;
@@ -102,6 +111,7 @@ struct symbol {
struct section *sec;
GElf_Sym sym;
char *name;
+ enum data_source name_source;
struct debug_symbol *relf_sym;
unsigned int index;
unsigned char bind;
@@ -132,8 +142,8 @@ struct upatch_elf {
void upatch_elf_open(struct upatch_elf *, const char *);
// Destory upatch_elf struct
-void upatch_elf_teardown(struct upatch_elf *);
+void upatch_elf_destroy(struct upatch_elf *);
-void upatch_elf_free(struct upatch_elf *);
+void upatch_elf_close(struct upatch_elf *);
#endif
--
2.34.1

View File

@ -0,0 +1,43 @@
From a1fa8c08a6605339ac9cb5d9101f4f24c7430f62 Mon Sep 17 00:00:00 2001
From: liuxiaobo <liuxiaobo19@huawei.com>
Date: Thu, 27 Jun 2024 16:22:26 +0800
Subject: [PATCH] upatch-hijacker: fix memory leak
Signed-off-by: liuxiaobo <liuxiaobo19@huawei.com>
---
upatch-hijacker/hijacker/gnu-as-hijacker.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/upatch-hijacker/hijacker/gnu-as-hijacker.c b/upatch-hijacker/hijacker/gnu-as-hijacker.c
index 860a84f..886420e 100644
--- a/upatch-hijacker/hijacker/gnu-as-hijacker.c
+++ b/upatch-hijacker/hijacker/gnu-as-hijacker.c
@@ -48,6 +48,7 @@ int main(int argc, char *argv[], char *envp[])
{
// Try to get executable path
const char *filename = get_current_exec();
+
if (filename == NULL) {
return -ENOENT;
}
@@ -111,9 +112,15 @@ int main(int argc, char *argv[], char *envp[])
(void)unlink(output_file);
}
+ int ret = 0;
if (symlink(new_output_file, output_file) != 0) {
- return execve(filename, argv, envp);
+ ret = execve(filename, argv, envp);
+ goto out;
}
- return execve(filename, (char* const*)new_argv, envp);
+ ret = execve(filename, (char* const*)new_argv, envp);
+out:
+ free(new_argv);
+
+ return ret;
}
--
2.34.1

View File

@ -0,0 +1,113 @@
From 93a0c2c9d1ad383758b595fa551b43366d82d047 Mon Sep 17 00:00:00 2001
From: liuxiaobo <liuxiaobo19@huawei.com>
Date: Thu, 27 Jun 2024 16:22:02 +0800
Subject: [PATCH] upatch-manage: fix memory leak
Signed-off-by: liuxiaobo <liuxiaobo19@huawei.com>
---
upatch-manage/arch/x86_64/ptrace.c | 7 ++--
upatch-manage/upatch-process.c | 61 ++++++++++++++++++------------
2 files changed, 39 insertions(+), 29 deletions(-)
diff --git a/upatch-manage/arch/x86_64/ptrace.c b/upatch-manage/arch/x86_64/ptrace.c
index 3d6dd72..95e2710 100644
--- a/upatch-manage/arch/x86_64/ptrace.c
+++ b/upatch-manage/arch/x86_64/ptrace.c
@@ -173,9 +173,8 @@ size_t get_upatch_addr_len()
return UPATCH_ADDR_LEN;
}
-
unsigned long get_new_insn(void)
{
- char jmp_insn[] = { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00};
- return *(unsigned long *)jmp_insn;
-}
\ No newline at end of file
+ // ASM: jmp word ptr [di] (FF25 0000 0000 0000)
+ return 0x25FF;
+}
diff --git a/upatch-manage/upatch-process.c b/upatch-manage/upatch-process.c
index 3b8db3b..84ec030 100644
--- a/upatch-manage/upatch-process.c
+++ b/upatch-manage/upatch-process.c
@@ -385,6 +385,40 @@ process_new_object(struct upatch_process *proc, dev_t dev, ino_t inode,
return o;
}
+static int add_upatch_object(struct upatch_process *proc,
+ struct object_file *o, unsigned long src, unsigned char *header_buf)
+{
+ struct object_patch *opatch;
+
+ opatch = malloc(sizeof(struct object_patch));
+ if (opatch == NULL) {
+ log_error("malloc opatch failed\n");
+ return -1;
+ }
+
+ opatch->uinfo = malloc(sizeof(struct upatch_info));
+ if (opatch->uinfo == NULL) {
+ log_error("malloc opatch->uinfo failed\n");
+ free(opatch);
+ return -1;
+ }
+
+ memcpy(opatch->uinfo, header_buf, sizeof(struct upatch_info));
+ opatch->funcs = malloc(opatch->uinfo->changed_func_num *
+ sizeof(struct upatch_info_func));
+ if (upatch_process_mem_read(proc, src, opatch->funcs,
+ opatch->uinfo->changed_func_num * sizeof(struct upatch_info_func))) {
+ log_error("can't read patch funcs at 0x%lx\n", src);
+ free(opatch->uinfo);
+ free(opatch);
+ return -1;
+ }
+ list_add(&opatch->list, &o->applied_patch);
+ o->num_applied_patch++;
+ o->is_patch = 1;
+
+ return 0;
+}
/**
* Returns: 0 if everything is ok, -1 on error.
*/
@@ -420,33 +454,10 @@ static int process_add_object_vma(struct upatch_process *proc, dev_t dev,
}
if (object_type == OBJECT_UPATCH) {
- struct object_patch *opatch;
-
- opatch = malloc(sizeof(struct object_patch));
- if (opatch == NULL) {
- return -1;
- }
-
- opatch->uinfo = malloc(sizeof(struct upatch_info));
- if (opatch->uinfo == NULL) {
- return -1;
- }
-
- memcpy(opatch->uinfo, header_buf, sizeof(struct upatch_info));
- opatch->funcs = malloc(opatch->uinfo->changed_func_num *
- sizeof(struct upatch_info_func));
- if (upatch_process_mem_read(
- proc, vma->start + sizeof(struct upatch_info),
- opatch->funcs,
- opatch->uinfo->changed_func_num *
- sizeof(struct upatch_info_func))) {
- log_error("can't read patch funcs at 0x%lx\n",
- vma->start + sizeof(struct upatch_info));
+ unsigned long src = vma->start + sizeof(struct upatch_info);
+ if (add_upatch_object(proc, o, src, header_buf) != 0) {
return -1;
}
- list_add(&opatch->list, &o->applied_patch);
- o->num_applied_patch++;
- o->is_patch = 1;
}
if (object_type == OBJECT_ELF) {
o->is_elf = 1;
--
2.34.1

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,242 @@
From c61c3e241f7a286df302a77ba6ed078dd56b9fb1 Mon Sep 17 00:00:00 2001
From: liuxiaobo <liuxiaobo19@huawei.com>
Date: Mon, 17 Jun 2024 16:22:08 +0800
Subject: [PATCH] all: implement asan & gcov build type
Signed-off-by: liuxiaobo <liuxiaobo19@huawei.com>
---
CMakeLists.txt | 127 ++++++++++++++++++++--------
upatch-diff/CMakeLists.txt | 4 +-
upatch-helper/helper/CMakeLists.txt | 4 +-
upatch-manage/CMakeLists.txt | 5 +-
4 files changed, 99 insertions(+), 41 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 659222f..04872b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,7 +8,12 @@ project(syscare)
include(GNUInstallDirs)
find_package(Git QUIET)
-# Version
+# Build type
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE RelWithDebInfo)
+endif()
+
+# Build version
if(NOT DEFINED BUILD_VERSION)
execute_process(
COMMAND sh -c "cat syscare/Cargo.toml | grep -F 'version' | head -n 1 | awk -F '\"' '{print $2}'"
@@ -27,12 +32,55 @@ if(GIT_FOUND)
ERROR_QUIET
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)
- set(BUILD_VERSION "${BUILD_VERSION}-g${GIT_VERSION}")
+ set(PROJECT_BUILD_VERSION "${BUILD_VERSION}-g${GIT_VERSION}")
else()
- set(BUILD_VERSION "${BUILD_VERSION}")
+ set(PROJECT_BUILD_VERSION "${BUILD_VERSION}")
+endif()
+
+# Build configurations
+if(ENABLE_ASAN)
+ set(PROJECT_BUILD_VERSION "${PROJECT_BUILD_VERSION}-asan")
+ list(APPEND PROJECT_C_BUILD_FLAGS -fsanitize=address -fno-omit-frame-pointer)
+ list(APPEND PROJECT_C_LIBRARIES asan)
endif()
-# Set install directories
+if(ENABLE_GCOV)
+ set(PROJECT_BUILD_VERSION "${PROJECT_BUILD_VERSION}-gcov")
+ list(APPEND PROJECT_C_BUILD_FLAGS -ftest-coverage -fprofile-arcs)
+ list(APPEND PROJECT_RUST_FLAGS -C instrument-coverage)
+ list(APPEND PROJECT_C_LIBRARIES gcov)
+endif()
+
+# Build flags
+list(APPEND PROJECT_C_BUILD_FLAGS
+ -std=gnu99 -g -Wall -O2 -Werror -Wextra
+ -DBUILD_VERSION="${PROJECT_BUILD_VERSION}" -D_FORTIFY_SOURCE=2
+ -Wtrampolines -Wformat=2 -Wstrict-prototypes -Wdate-time
+ -Wstack-usage=8192 -Wfloat-equal -Wswitch-default
+ -Wshadow -Wconversion -Wcast-qual -Wcast-align -Wunused -Wundef
+ -funsigned-char -fstack-protector-all -fpic -fpie -ftrapv
+ -fstack-check -freg-struct-return -fno-canonical-system-headers
+ -pipe -fdebug-prefix-map=old=new
+)
+list(APPEND PROJECT_RUST_FLAGS
+ --cfg unsound_local_offset
+ -C relocation_model=pic
+ -D warnings
+ -C link-arg=-s
+ -C overflow_checks
+ -W rust_2021_incompatible_closure_captures
+)
+
+# Link flags
+list(APPEND PROJECT_C_LINK_FLAGS
+ -pie
+ -Wl,-z,relro,-z,now
+ -Wl,-z,noexecstack -rdynamic
+ -Wl,-Bsymbolic
+ -Wl,-no-undefined
+)
+
+# Install directories
set(SYSCARE_BINARY_DIR "${CMAKE_INSTALL_FULL_BINDIR}")
set(SYSCARE_LIBEXEC_DIR "${CMAKE_INSTALL_FULL_LIBEXECDIR}/syscare")
set(SYSCARE_SERVICE_DIR "${CMAKE_INSTALL_PREFIX}/lib/systemd/system")
@@ -46,48 +94,53 @@ message("╚════██║ ╚██╔╝ ╚════██║█
message("███████║ ██║ ███████║╚██████╗██║ ██║██║ ██║███████╗")
message("╚══════╝ ╚═╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝")
message("---------------------------------------------------------")
-message("-- Verion: ${BUILD_VERSION}")
+message("-- Verion: ${PROJECT_BUILD_VERSION}")
+message("-- Rust flags: ${PROJECT_RUST_FLAGS}")
+message("-- Build flags: ${PROJECT_C_BUILD_FLAGS}")
+message("-- Link flags: ${PROJECT_C_LINK_FLAGS}")
+message("-- Link libraries: ${PROJECT_C_LIBRARIES}")
message("-- Binary directory: ${SYSCARE_BINARY_DIR}")
message("-- Libexec directory: ${SYSCARE_LIBEXEC_DIR}")
message("-- Service directory: ${SYSCARE_SERVICE_DIR}")
message("---------------------------------------------------------")
-# Compile options
-add_compile_options(-DBUILD_VERSION="${BUILD_VERSION}")
-add_compile_options(-std=gnu99 -g -Wall -D_FORTIFY_SOURCE=2 -O2 -Werror -Wextra
- -Wtrampolines -Wformat=2 -Wstrict-prototypes -Wdate-time -Wstack-usage=8192
- -Wfloat-equal -Wswitch-default -Wshadow -Wconversion -Wcast-qual -Wcast-align
- -Wunused -Wundef -funsigned-char -fstack-protector-all -fpic -fpie -ftrapv
- -fstack-check -freg-struct-return -fno-canonical-system-headers -pipe
- -fdebug-prefix-map=old=new)
-set(LINK_FLAGS "-pie -Wl,-z,relro,-z,now -Wl,-z,noexecstack -rdynamic -Wl,-Bsymbolic -Wl,-no-undefined")
-set(CMAKE_SHARED_LINKER_FLAGS "${LINK_FLAGS}")
-set(CMAKE_EXE_LINKER_FLAGS "${LINK_FLAGS}")
-# Subdirectories
-add_subdirectory(upatch-diff)
-add_subdirectory(upatch-manage)
-add_subdirectory(upatch-helper)
-add_subdirectory(misc)
+# Apply all flags
+add_compile_options(${PROJECT_C_BUILD_FLAGS})
+add_link_options(${PROJECT_C_LINK_FLAGS})
+link_libraries(${PROJECT_C_LIBRARIES})
# Build rust executables
-add_custom_target(rust-executables ALL
+foreach(FLAG IN LISTS PROJECT_RUST_FLAGS)
+ set(RUSTFLAGS "${RUSTFLAGS} ${FLAG}")
+endforeach()
+
+add_custom_target(rust-build ALL
COMMENT "Building rust executables..."
COMMAND ${CMAKE_COMMAND} -E env
- "BUILD_VERSION=${BUILD_VERSION}"
- "RUSTFLAGS=--cfg unsound_local_offset -C relocation_model=pic -D warnings -C link-arg=-s -C overflow_checks -W rust_2021_incompatible_closure_captures"
- cargo build --release --target-dir ${CMAKE_CURRENT_BINARY_DIR}
+ "BUILD_VERSION=${PROJECT_BUILD_VERSION}"
+ "RUSTFLAGS=${RUSTFLAGS}"
+ cargo build --release --target-dir "${CMAKE_CURRENT_BINARY_DIR}/rust"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
# Install rust binaries
install(
PROGRAMS
- ${CMAKE_CURRENT_BINARY_DIR}/release/upatchd
- ${CMAKE_CURRENT_BINARY_DIR}/release/syscared
- ${CMAKE_CURRENT_BINARY_DIR}/release/syscare
+ ${CMAKE_CURRENT_BINARY_DIR}/rust/release/upatchd
+ ${CMAKE_CURRENT_BINARY_DIR}/rust/release/syscared
+ PERMISSIONS
+ OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ GROUP_READ GROUP_EXECUTE
+ DESTINATION
+ ${SYSCARE_BINARY_DIR}
+)
+
+install(
+ PROGRAMS
+ ${CMAKE_CURRENT_BINARY_DIR}/rust/release/syscare
PERMISSIONS
- OWNER_EXECUTE OWNER_WRITE OWNER_READ
- GROUP_EXECUTE GROUP_READ
+ OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
DESTINATION
${SYSCARE_BINARY_DIR}
@@ -95,12 +148,18 @@ install(
install(
PROGRAMS
- ${CMAKE_CURRENT_BINARY_DIR}/release/upatch-build
- ${CMAKE_CURRENT_BINARY_DIR}/release/syscare-build
+ ${CMAKE_CURRENT_BINARY_DIR}/rust/release/upatch-build
+ ${CMAKE_CURRENT_BINARY_DIR}/rust/release/syscare-build
PERMISSIONS
- OWNER_EXECUTE OWNER_WRITE OWNER_READ
- GROUP_EXECUTE GROUP_READ
+ OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
DESTINATION
${SYSCARE_LIBEXEC_DIR}
)
+
+# Build other components
+add_subdirectory(upatch-diff)
+add_subdirectory(upatch-manage)
+add_subdirectory(upatch-helper)
+add_subdirectory(misc)
diff --git a/upatch-diff/CMakeLists.txt b/upatch-diff/CMakeLists.txt
index 45091fc..a1c8688 100644
--- a/upatch-diff/CMakeLists.txt
+++ b/upatch-diff/CMakeLists.txt
@@ -18,8 +18,8 @@ install(
TARGETS
upatch-diff
PERMISSIONS
- OWNER_EXECUTE OWNER_WRITE OWNER_READ
- GROUP_EXECUTE GROUP_READ
+ OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
DESTINATION
${SYSCARE_LIBEXEC_DIR}
diff --git a/upatch-helper/helper/CMakeLists.txt b/upatch-helper/helper/CMakeLists.txt
index fefcebe..700722b 100644
--- a/upatch-helper/helper/CMakeLists.txt
+++ b/upatch-helper/helper/CMakeLists.txt
@@ -27,8 +27,8 @@ install(
${CMAKE_CURRENT_BINARY_DIR}/cc-helper
${CMAKE_CURRENT_BINARY_DIR}/c++-helper
PERMISSIONS
- OWNER_EXECUTE OWNER_WRITE OWNER_READ
- GROUP_EXECUTE GROUP_READ
+ OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
DESTINATION
${SYSCARE_LIBEXEC_DIR}
diff --git a/upatch-manage/CMakeLists.txt b/upatch-manage/CMakeLists.txt
index 850a308..e09aa9c 100644
--- a/upatch-manage/CMakeLists.txt
+++ b/upatch-manage/CMakeLists.txt
@@ -25,9 +25,8 @@ install(
TARGETS
${UPATCH_MANAGE}
PERMISSIONS
- OWNER_EXECUTE OWNER_WRITE OWNER_READ
- GROUP_EXECUTE GROUP_READ
- WORLD_READ WORLD_EXECUTE
+ OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ GROUP_READ GROUP_EXECUTE
DESTINATION
${SYSCARE_LIBEXEC_DIR}
)
--
2.34.1

2498
0037-all-clean-code.patch Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,62 @@
From 6c1d025b3328845377338d6a09b30a23611ba934 Mon Sep 17 00:00:00 2001
From: Zhao Mengmeng <zhaomengmeng@kylinos.cn>
Date: Mon, 17 Jun 2024 16:18:20 +0800
Subject: [PATCH] syscare-abi: remove display limit of patch_info
When executing with `syscare info xxx`, show all the patches
it contains.
Signed-off-by: Zhao Mengmeng <zhaomengmeng@kylinos.cn>
---
syscare-abi/src/patch_info.rs | 21 +++------------------
1 file changed, 3 insertions(+), 18 deletions(-)
diff --git a/syscare-abi/src/patch_info.rs b/syscare-abi/src/patch_info.rs
index 246f830..65b7650 100644
--- a/syscare-abi/src/patch_info.rs
+++ b/syscare-abi/src/patch_info.rs
@@ -71,8 +71,6 @@ impl PatchInfo {
impl std::fmt::Display for PatchInfo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- const LIST_DISPLAY_LIMIT: usize = 9;
-
writeln!(f, "name: {}", self.name)?;
writeln!(f, "version: {}", self.version)?;
writeln!(f, "release: {}", self.release)?;
@@ -84,10 +82,6 @@ impl std::fmt::Display for PatchInfo {
if !self.entities.is_empty() {
writeln!(f, "entities:")?;
for (entity_idx, entity) in self.entities.iter().enumerate() {
- if entity_idx >= LIST_DISPLAY_LIMIT {
- writeln!(f, "* ......")?;
- break;
- }
writeln!(f, "* {}", entity.patch_name.to_string_lossy())?;
}
}
@@ -96,18 +90,9 @@ impl std::fmt::Display for PatchInfo {
writeln!(f, "patches:")?;
let last_idx = self.patches.len() - 1;
for (patch_idx, patch_file) in self.patches.iter().enumerate() {
- if patch_idx != last_idx {
- if patch_idx >= LIST_DISPLAY_LIMIT {
- writeln!(f, "* ......")?;
- break;
- }
- writeln!(f, "* {}", patch_file.name.to_string_lossy())?
- } else {
- if patch_idx >= LIST_DISPLAY_LIMIT {
- write!(f, "* ......")?;
- break;
- }
- write!(f, "* {}", patch_file.name.to_string_lossy())?
+ match patch_idx == last_idx {
+ false => writeln!(f, "* {}", patch_file.name.to_string_lossy())?,
+ true => write!(f, "* {}", patch_file.name.to_string_lossy())?,
}
}
}
--
2.34.1

View File

@ -0,0 +1,49 @@
From 345ea586c7fa196f0778eb28b78c9ceb51e5db75 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net>
Date: Sat, 29 Jun 2024 17:03:30 +0800
Subject: [PATCH] syscare-abi: fix clippy warnings
Signed-off-by: renoseven <dev@renoseven.net>
---
syscare-abi/src/patch_info.rs | 24 ++++++++++--------------
1 file changed, 10 insertions(+), 14 deletions(-)
diff --git a/syscare-abi/src/patch_info.rs b/syscare-abi/src/patch_info.rs
index 65b7650..f23ce9b 100644
--- a/syscare-abi/src/patch_info.rs
+++ b/syscare-abi/src/patch_info.rs
@@ -79,21 +79,17 @@ impl std::fmt::Display for PatchInfo {
writeln!(f, "target: {}", self.target.short_name())?;
writeln!(f, "license: {}", self.target.license)?;
writeln!(f, "description: {}", self.description)?;
- if !self.entities.is_empty() {
- writeln!(f, "entities:")?;
- for (entity_idx, entity) in self.entities.iter().enumerate() {
- writeln!(f, "* {}", entity.patch_name.to_string_lossy())?;
- }
+ writeln!(f, "entities:")?;
+ for entity in &self.entities {
+ writeln!(f, "* {}", entity.patch_name.to_string_lossy())?;
}
-
- if !self.patches.is_empty() {
- writeln!(f, "patches:")?;
- let last_idx = self.patches.len() - 1;
- for (patch_idx, patch_file) in self.patches.iter().enumerate() {
- match patch_idx == last_idx {
- false => writeln!(f, "* {}", patch_file.name.to_string_lossy())?,
- true => write!(f, "* {}", patch_file.name.to_string_lossy())?,
- }
+ writeln!(f, "patches:")?;
+ let last_idx = self.patches.len() - 1;
+ for (idx, patch) in self.patches.iter().enumerate() {
+ if idx == last_idx {
+ write!(f, "* {}", patch.name.to_string_lossy())?
+ } else {
+ writeln!(f, "* {}", patch.name.to_string_lossy())?
}
}
--
2.34.1

View File

@ -0,0 +1,30 @@
From 8f1372be9df4a60c6b3b50bfbfa6327fc2281647 Mon Sep 17 00:00:00 2001
From: lixiang_yewu <lixiang_yewu@cmss.chinamobile.com>
Date: Thu, 1 Aug 2024 02:34:16 +0000
Subject: [PATCH] =?UTF-8?q?update=20README.md.=20=E6=8C=87=E4=BB=A4?=
=?UTF-8?q?=E5=86=99=E9=94=99=E4=BA=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: lixiang_yewu <lixiang_yewu@cmss.chinamobile.com>
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 138c059..f12b03d 100644
--- a/README.md
+++ b/README.md
@@ -113,7 +113,7 @@ $ sudo syscare active redis-6.2.5-1/HP001
3. 补丁去激活
```bash
-$ sudo syscarae deactive redis-6.2.5-1/HP001
+$ sudo syscare deactive redis-6.2.5-1/HP001
```
4. 补丁卸载/移除
--
2.34.1

View File

@ -0,0 +1,46 @@
From f0c9f95fec6b8c3b6ee7f4852605b346d903c0e6 Mon Sep 17 00:00:00 2001
From: ningyu <405888464@qq.com>
Date: Fri, 9 Aug 2024 12:17:18 +0800
Subject: [PATCH] upatch-diff: fix .rela.text section status bug
Signed-off-by: ningyu <405888464@qq.com>
---
upatch-diff/create-diff-object.c | 2 +-
upatch-diff/elf-compare.c | 6 ++----
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/upatch-diff/create-diff-object.c b/upatch-diff/create-diff-object.c
index 8830956..0eea362 100644
--- a/upatch-diff/create-diff-object.c
+++ b/upatch-diff/create-diff-object.c
@@ -868,7 +868,7 @@ static void verify_patchability(struct upatch_elf *uelf)
int errs = 0;
list_for_each_entry(sec, &uelf->sections, list) {
- if (sec->status == CHANGED && !sec->include) {
+ if (sec->status == CHANGED && !sec->include && !is_rela_section(sec)) {
log_normal("Section '%s' is changed, but it is not selected for inclusion\n", sec->name);
errs++;
}
diff --git a/upatch-diff/elf-compare.c b/upatch-diff/elf-compare.c
index 851c25f..5d39825 100644
--- a/upatch-diff/elf-compare.c
+++ b/upatch-diff/elf-compare.c
@@ -345,12 +345,10 @@ static inline void update_section_status(struct section *sec, enum status status
sec->twin->status = status;
}
if (is_rela_section(sec)) {
- if ((sec->base != NULL) &&
- (sec->base->sym != NULL)) {
+ if ((sec->base != NULL) && (sec->base->sym != NULL) && status != SAME) {
sec->base->sym->status = status;
}
- }
- else {
+ } else {
if (sec->sym != NULL) {
sec->sym->status = status;
}
--
2.34.1

View File

@ -0,0 +1,34 @@
From c5422f8da6735efb5746c167fef01d9c20bd69e5 Mon Sep 17 00:00:00 2001
From: ningyu <405888464@qq.com>
Date: Fri, 9 Aug 2024 14:18:50 +0800
Subject: [PATCH] upatch-manage: resolve plt firstly
Signed-off-by: ningyu <405888464@qq.com>
---
upatch-manage/upatch-resolve.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/upatch-manage/upatch-resolve.c b/upatch-manage/upatch-resolve.c
index 197ea2f..5f1c2de 100644
--- a/upatch-manage/upatch-resolve.c
+++ b/upatch-manage/upatch-resolve.c
@@ -254,12 +254,12 @@ static unsigned long resolve_symbol(struct upatch_elf *uelf,
* Approach 3 is more general, but difficulty to implement.
*/
- /* resolve from got */
- elf_addr = resolve_rela_dyn(uelf, obj, name, &patch_sym);
+ /* resolve from plt */
+ elf_addr = resolve_rela_plt(uelf, obj, name, &patch_sym);
- /* resolve from plt */
+ /* resolve from got */
if (!elf_addr) {
- elf_addr = resolve_rela_plt(uelf, obj, name, &patch_sym);
+ elf_addr = resolve_rela_dyn(uelf, obj, name, &patch_sym);
}
/* resolve from dynsym */
--
2.34.1

View File

@ -0,0 +1,261 @@
From d0bd28247e41b9cec11d61f0d1b6a86f78a4dabd Mon Sep 17 00:00:00 2001
From: ningyu <405888464@qq.com>
Date: Fri, 9 Aug 2024 14:33:01 +0800
Subject: [PATCH] upatch-manage: fix find upatch region bug
Signed-off-by: ningyu <405888464@qq.com>
---
upatch-manage/arch/aarch64/process.h | 28 ---------
upatch-manage/arch/x86_64/process.h | 28 ---------
upatch-manage/upatch-patch.c | 2 +-
upatch-manage/upatch-process.c | 91 ++++++----------------------
upatch-manage/upatch-process.h | 6 +-
5 files changed, 23 insertions(+), 132 deletions(-)
delete mode 100644 upatch-manage/arch/aarch64/process.h
delete mode 100644 upatch-manage/arch/x86_64/process.h
diff --git a/upatch-manage/arch/aarch64/process.h b/upatch-manage/arch/aarch64/process.h
deleted file mode 100644
index 8acf04b..0000000
--- a/upatch-manage/arch/aarch64/process.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * upatch-manage
- * Copyright (C) 2024 Huawei Technologies Co., Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PROCESS__
-#define __PROCESS__
-
-#ifndef MAX_DISTANCE
-#define MAX_DISTANCE 0x8000000
-#endif
-
-#endif
\ No newline at end of file
diff --git a/upatch-manage/arch/x86_64/process.h b/upatch-manage/arch/x86_64/process.h
deleted file mode 100644
index 5de8fc3..0000000
--- a/upatch-manage/arch/x86_64/process.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * upatch-manage
- * Copyright (C) 2024 Huawei Technologies Co., Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __PROCESS__
-#define __PROCESS__
-
-#ifndef MAX_DISTANCE
-#define MAX_DISTANCE 0x80000000
-#endif
-
-#endif
\ No newline at end of file
diff --git a/upatch-manage/upatch-patch.c b/upatch-manage/upatch-patch.c
index 8a1ad41..c9fcbc9 100644
--- a/upatch-manage/upatch-patch.c
+++ b/upatch-manage/upatch-patch.c
@@ -271,7 +271,7 @@ static void *upatch_alloc(struct object_file *obj, size_t sz)
unsigned long addr;
struct vm_hole *hole = NULL;
- addr = object_find_patch_region_nolimit(obj, sz, &hole);
+ addr = object_find_patch_region(obj, sz, &hole);
if (!addr)
return NULL;
diff --git a/upatch-manage/upatch-process.c b/upatch-manage/upatch-process.c
index 84ec030..f4033cb 100644
--- a/upatch-manage/upatch-process.c
+++ b/upatch-manage/upatch-process.c
@@ -33,7 +33,6 @@
#include "list.h"
#include "log.h"
-#include "process.h"
#include "upatch-common.h"
#include "upatch-elf.h"
#include "upatch-process.h"
@@ -804,8 +803,9 @@ int vm_hole_split(struct vm_hole *hole, unsigned long alloc_start,
* and the next hole as a right candidate. Pace through them until there is
* enough space in the hole for the patch.
*
- * Since holes can be much larger than 2GiB take extra caution to allocate
- * patch region inside the (-2GiB, +2GiB) range from the original object.
+ * Due to relocation constraints, the hole position should be whin 4GB range
+ * from the obj.
+ * eg: R_AARCH64_ADR_GOT_PAGE
*/
unsigned long object_find_patch_region(struct object_file *obj, size_t memsize,
struct vm_hole **hole)
@@ -813,96 +813,41 @@ unsigned long object_find_patch_region(struct object_file *obj, size_t memsize,
struct list_head *head = &obj->proc->vmaholes;
struct vm_hole *left_hole = obj->previous_hole;
struct vm_hole *right_hole = next_hole(left_hole, head);
- unsigned long max_distance = MAX_DISTANCE;
+ unsigned long region_start = 0;
struct obj_vm_area *sovma;
-
unsigned long obj_start, obj_end;
- unsigned long region_start = 0, region_end = 0;
-
- log_debug("Looking for patch region for '%s'...\n", obj->name);
sovma = list_first_entry(&obj->vma, struct obj_vm_area, list);
obj_start = sovma->inmem.start;
sovma = list_entry(obj->vma.prev, struct obj_vm_area, list);
obj_end = sovma->inmem.end;
- max_distance -= memsize;
-
- /* TODO carefully check for the holes laying between obj_start and
- * obj_end, i.e. just after the executable segment of an executable
- */
- while (left_hole != NULL && right_hole != NULL) {
- if (right_hole != NULL &&
- right_hole->start - obj_start > max_distance)
- right_hole = NULL;
- else if (hole_size(right_hole) > memsize) {
- region_start = right_hole->start;
- region_end = (right_hole->end - obj_start) <=
- max_distance ?
- right_hole->end - memsize :
- obj_start + max_distance;
- *hole = right_hole;
- break;
- } else
- right_hole = next_hole(right_hole, head);
-
- if (left_hole != NULL &&
- obj_end - left_hole->end > max_distance)
- left_hole = NULL;
- else if (hole_size(left_hole) > memsize) {
- region_start = (obj_end - left_hole->start) <=
- max_distance ?
- left_hole->start :
- obj_end > max_distance ?
- obj_end - max_distance :
- 0;
- region_end = left_hole->end - memsize;
- *hole = left_hole;
- break;
- } else
- left_hole = prev_hole(left_hole, head);
- }
-
- if (region_start == region_end) {
- log_error("Cannot find suitable region for patch '%s'\n", obj->name);
- return -1UL;
- }
-
- region_start = (region_start >> (unsigned long)PAGE_SHIFT) << (unsigned long)PAGE_SHIFT;
- log_debug("Found patch region for '%s' at 0x%lx\n", obj->name,
- region_start);
-
- return region_start;
-}
-unsigned long object_find_patch_region_nolimit(struct object_file *obj, size_t memsize,
- struct vm_hole **hole)
-{
- struct list_head *head = &obj->proc->vmaholes;
- struct vm_hole *left_hole = obj->previous_hole;
- struct vm_hole *right_hole = next_hole(left_hole, head);
- unsigned long region_start = 0;
-
log_debug("Looking for patch region for '%s'...\n", obj->name);
- while (right_hole != NULL) {
+ while (right_hole != NULL || left_hole != NULL) {
if (hole_size(right_hole) > memsize) {
*hole = right_hole;
+ region_start = right_hole->start;
+ if (region_start + memsize - obj_start > MAX_DISTANCE) {
+ continue;
+ }
goto found;
- } else
- right_hole = next_hole(right_hole, head);
-
- while (left_hole != NULL)
+ }
if (hole_size(left_hole) > memsize) {
*hole = left_hole;
+ region_start = left_hole->end - memsize;
+ if (obj_end - region_start > MAX_DISTANCE) {
+ continue;
+ }
goto found;
- } else
- left_hole = prev_hole(left_hole, head);
+ }
+ right_hole = next_hole(right_hole, head);
+ left_hole = prev_hole(left_hole, head);
}
-
log_error("Cannot find suitable region for patch '%s'\n", obj->name);
return -1UL;
found:
- region_start = ((*hole)->start >> PAGE_SHIFT) << PAGE_SHIFT;
+ region_start = (region_start >> PAGE_SHIFT) << PAGE_SHIFT;
log_debug("Found patch region for '%s' 0xat %lx\n", obj->name,
region_start);
diff --git a/upatch-manage/upatch-process.h b/upatch-manage/upatch-process.h
index be44cb5..fdbd752 100644
--- a/upatch-manage/upatch-process.h
+++ b/upatch-manage/upatch-process.h
@@ -33,6 +33,10 @@
#define ELFMAG "\177ELF"
#define SELFMAG 4
+#ifndef MAX_DISTANCE
+#define MAX_DISTANCE (1UL << 32)
+#endif
+
enum {
MEM_READ,
MEM_WRITE,
@@ -143,7 +147,5 @@ int vm_hole_split(struct vm_hole *, unsigned long, unsigned long);
unsigned long object_find_patch_region(struct object_file *, size_t,
struct vm_hole **);
-unsigned long object_find_patch_region_nolimit(struct object_file *, size_t,
- struct vm_hole **);
#endif
--
2.34.1

View File

@ -0,0 +1,26 @@
From 7de47352a1201c4836ee71d119e07a5e544a16b4 Mon Sep 17 00:00:00 2001
From: Caohongtao <caohongtao_yewu@cmss.chinamobile.com>
Date: Wed, 14 Aug 2024 06:39:31 +0000
Subject: [PATCH] update README.md.
Signed-off-by: Caohongtao <caohongtao_yewu@cmss.chinamobile.com>
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index f12b03d..15d4d48 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
## 软件架构
- 可以利用系统组件源代码与相应的patch问题制作出相应组件补丁的RPM包含补丁文件、依赖信息与配置信息等. 制作的补丁RPM可以上传到相应的补丁仓库中集群的系统demon定时去查询补丁仓库, 对系统中运行的CVE与软件错误进行热修复保证系统安全、稳定、高效运行。
+ 可以利用系统组件源代码与相应的patch问题制作出相应组件补丁的RPM包含补丁文件、依赖信息与配置信息等. 制作的补丁RPM可以上传到相应的补丁仓库中集群的系统daemon定时去查询补丁仓库, 对系统中运行的CVE与软件错误进行热修复保证系统安全、稳定、高效运行。
--
2.34.1

View File

@ -0,0 +1,28 @@
From e07e30d88d38227f9899b1a7a2e6de85e2f36c4e Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net>
Date: Tue, 13 Aug 2024 17:31:50 +0800
Subject: [PATCH] common: fix 'normalize empty path return current path' issue
Signed-off-by: renoseven <dev@renoseven.net>
---
syscare-common/src/fs/fs_impl.rs | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/syscare-common/src/fs/fs_impl.rs b/syscare-common/src/fs/fs_impl.rs
index e794c98..29c5d6e 100644
--- a/syscare-common/src/fs/fs_impl.rs
+++ b/syscare-common/src/fs/fs_impl.rs
@@ -290,6 +290,10 @@ pub fn normalize<P: AsRef<Path>>(path: P) -> io::Result<PathBuf> {
let mut new_path = PathBuf::new();
let orig_path = path.as_ref();
+ if orig_path.as_os_str().is_empty() {
+ return Ok(new_path);
+ }
+
if orig_path.is_relative() {
new_path.push(env::current_dir()?);
}
--
2.34.1

View File

@ -0,0 +1,30 @@
From 1c70edca6667730867cdd1e5691885ebae9c04bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AE=81=E5=AE=87?= <405888464@qq.com>
Date: Thu, 15 Aug 2024 07:33:24 +0000
Subject: [PATCH] syscared: Add PACTCH_CHECK action when status change from
Deactived to Actived
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: 宁宇 <405888464@qq.com>
---
syscared/src/patch/manager.rs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/syscared/src/patch/manager.rs b/syscared/src/patch/manager.rs
index d156e4a..3a724db 100644
--- a/syscared/src/patch/manager.rs
+++ b/syscared/src/patch/manager.rs
@@ -54,7 +54,7 @@ lazy_static! {
(PatchStatus::NotApplied, PatchStatus::Actived) => vec![PATCH_CHECK, PATCH_APPLY, PATCH_ACTIVE],
(PatchStatus::NotApplied, PatchStatus::Accepted) => vec![PATCH_CHECK, PATCH_APPLY, PATCH_ACTIVE, PATCH_ACCEPT],
(PatchStatus::Deactived, PatchStatus::NotApplied) => vec![PATCH_REMOVE],
- (PatchStatus::Deactived, PatchStatus::Actived) => vec![PATCH_ACTIVE],
+ (PatchStatus::Deactived, PatchStatus::Actived) => vec![PATCH_CHECK, PATCH_ACTIVE],
(PatchStatus::Deactived, PatchStatus::Accepted) => vec![PATCH_ACTIVE, PATCH_ACCEPT],
(PatchStatus::Actived, PatchStatus::NotApplied) => vec![PATCH_DEACTIVE, PATCH_REMOVE],
(PatchStatus::Actived, PatchStatus::Deactived) => vec![PATCH_DEACTIVE],
--
2.34.1

View File

@ -0,0 +1,207 @@
From 058670c8782b8b840fb99ddc174e00feb3b9ff89 Mon Sep 17 00:00:00 2001
From: renoseven <dev@renoseven.net>
Date: Fri, 16 Aug 2024 14:21:00 +0800
Subject: [PATCH] all: fix compile failure of rustc 1.80
Signed-off-by: renoseven <dev@renoseven.net>
---
syscare-build/src/build_root/package_root.rs | 6 ++----
syscare-build/src/build_root/patch_root.rs | 11 +++--------
syscared/src/patch/entity/kpatch.rs | 3 +--
syscared/src/patch/entity/upatch.rs | 3 +--
syscared/src/patch/resolver/kpatch.rs | 11 +++++++----
syscared/src/patch/resolver/upatch.rs | 7 +++----
6 files changed, 17 insertions(+), 24 deletions(-)
diff --git a/syscare-build/src/build_root/package_root.rs b/syscare-build/src/build_root/package_root.rs
index 75ff65d..eaac349 100644
--- a/syscare-build/src/build_root/package_root.rs
+++ b/syscare-build/src/build_root/package_root.rs
@@ -25,7 +25,6 @@ const BUILD_ROOT_DIR_NAME: &str = "patch";
#[derive(Debug, Clone)]
pub struct PackageRoot {
- pub path: PathBuf,
pub source: PathBuf,
pub debuginfo: PathBuf,
pub build_root: PackageBuildRoot,
@@ -33,17 +32,16 @@ pub struct PackageRoot {
impl PackageRoot {
pub fn new<P: AsRef<Path>>(directory: P) -> Result<Self> {
- let path = directory.as_ref().to_path_buf();
+ let path = directory.as_ref();
let source = path.join(SOURCE_DIR_NAME);
let debuginfo = path.join(DEBUGINFO_DIR_NAME);
let build_root = PackageBuildRoot::new(path.join(BUILD_ROOT_DIR_NAME))?;
- fs::create_dir_all(&path)?;
+ fs::create_dir_all(path)?;
fs::create_dir_all(&source)?;
fs::create_dir_all(&debuginfo)?;
Ok(Self {
- path,
source,
debuginfo,
build_root,
diff --git a/syscare-build/src/build_root/patch_root.rs b/syscare-build/src/build_root/patch_root.rs
index d493233..0aa0a1c 100644
--- a/syscare-build/src/build_root/patch_root.rs
+++ b/syscare-build/src/build_root/patch_root.rs
@@ -22,25 +22,20 @@ const OUTPUT_DIR_NAME: &str = "output";
#[derive(Debug, Clone)]
pub struct PatchRoot {
- pub path: PathBuf,
pub build: PathBuf,
pub output: PathBuf,
}
impl PatchRoot {
pub fn new<P: AsRef<Path>>(directory: P) -> Result<Self> {
- let path = directory.as_ref().to_path_buf();
+ let path = directory.as_ref();
let build = path.join(BUILD_DIR_NAME);
let output = path.join(OUTPUT_DIR_NAME);
- fs::create_dir_all(&path)?;
+ fs::create_dir_all(path)?;
fs::create_dir_all(&build)?;
fs::create_dir_all(&output)?;
- Ok(Self {
- path,
- build,
- output,
- })
+ Ok(Self { build, output })
}
}
diff --git a/syscared/src/patch/entity/kpatch.rs b/syscared/src/patch/entity/kpatch.rs
index ab2c8b2..a6b48c5 100644
--- a/syscared/src/patch/entity/kpatch.rs
+++ b/syscared/src/patch/entity/kpatch.rs
@@ -14,7 +14,7 @@
use std::{ffi::OsString, path::PathBuf, sync::Arc};
-use syscare_abi::{PatchInfo, PatchType};
+use syscare_abi::PatchInfo;
use uuid::Uuid;
/// Kernel patch function definition
@@ -61,7 +61,6 @@ impl std::fmt::Display for KernelPatchFunction {
pub struct KernelPatch {
pub uuid: Uuid,
pub name: OsString,
- pub kind: PatchType,
pub info: Arc<PatchInfo>,
pub pkg_name: String,
pub module_name: OsString,
diff --git a/syscared/src/patch/entity/upatch.rs b/syscared/src/patch/entity/upatch.rs
index ef24866..0fbacb4 100644
--- a/syscared/src/patch/entity/upatch.rs
+++ b/syscared/src/patch/entity/upatch.rs
@@ -14,7 +14,7 @@
use std::{ffi::OsString, path::PathBuf, sync::Arc};
-use syscare_abi::{PatchInfo, PatchType};
+use syscare_abi::PatchInfo;
use uuid::Uuid;
/// User patch function definition
@@ -58,7 +58,6 @@ impl std::fmt::Display for UserPatchFunction {
pub struct UserPatch {
pub uuid: Uuid,
pub name: OsString,
- pub kind: PatchType,
pub info: Arc<PatchInfo>,
pub pkg_name: String,
pub functions: Vec<UserPatchFunction>,
diff --git a/syscared/src/patch/resolver/kpatch.rs b/syscared/src/patch/resolver/kpatch.rs
index 7946c42..85ec18e 100644
--- a/syscared/src/patch/resolver/kpatch.rs
+++ b/syscared/src/patch/resolver/kpatch.rs
@@ -21,7 +21,7 @@ use std::{
use anyhow::{anyhow, Context, Result};
use object::{NativeFile, Object, ObjectSection};
-use syscare_abi::{PatchEntity, PatchInfo, PatchType};
+use syscare_abi::{PatchEntity, PatchInfo};
use syscare_common::{
concat_os,
ffi::{CStrExt, OsStrExt},
@@ -71,7 +71,7 @@ mod ffi {
unsafe impl Pod for KpatchFunction {}
pub struct KpatchRelocation {
- pub addr: (u64, Relocation),
+ pub _addr: (u64, Relocation),
pub name: (u64, Relocation),
pub object: (u64, Relocation),
}
@@ -93,7 +93,11 @@ mod ffi {
if let (Some(addr), Some(name), Some(object)) =
(self.0.next(), self.0.next(), self.0.next())
{
- return Some(KpatchRelocation { addr, name, object });
+ return Some(KpatchRelocation {
+ _addr: addr,
+ name,
+ object,
+ });
}
None
}
@@ -205,7 +209,6 @@ impl PatchResolverImpl for KpatchResolverImpl {
"/",
&patch_entity.patch_target
),
- kind: PatchType::KernelPatch,
info: patch_info.clone(),
pkg_name: patch_info.target.full_name(),
module_name,
diff --git a/syscared/src/patch/resolver/upatch.rs b/syscared/src/patch/resolver/upatch.rs
index cb06c24..e8c2f2c 100644
--- a/syscared/src/patch/resolver/upatch.rs
+++ b/syscared/src/patch/resolver/upatch.rs
@@ -21,7 +21,7 @@ use std::{
use anyhow::{anyhow, Context, Result};
use object::{NativeFile, Object, ObjectSection};
-use syscare_abi::{PatchEntity, PatchInfo, PatchType};
+use syscare_abi::{PatchEntity, PatchInfo};
use syscare_common::{concat_os, ffi::CStrExt, fs};
use super::PatchResolverImpl;
@@ -59,7 +59,7 @@ mod ffi {
pub const UPATCH_FUNCTION_OFFSET: usize = 40;
pub struct UpatchRelocation {
- pub addr: (u64, Relocation),
+ pub _addr: (u64, Relocation),
pub name: (u64, Relocation),
}
@@ -78,7 +78,7 @@ mod ffi {
fn next(&mut self) -> Option<Self::Item> {
if let (Some(addr), Some(name)) = (self.0.next(), self.0.next()) {
- return Some(UpatchRelocation { addr, name });
+ return Some(UpatchRelocation { _addr: addr, name });
}
None
}
@@ -168,7 +168,6 @@ impl PatchResolverImpl for UpatchResolverImpl {
"/",
fs::file_name(&patch_entity.patch_target)
),
- kind: PatchType::UserPatch,
info: patch_info.clone(),
pkg_name: patch_info.target.full_name(),
patch_file: patch_root.join(&patch_entity.patch_name),
--
2.34.1

View File

@ -1,46 +1,65 @@
%define build_version %{version}-%{release} %define build_version %{version}-%{release}
%define kernel_devel_rpm %(echo $(rpm -q kernel-devel | head -n 1)) %define kernel_devel_rpm %(echo $(rpm -q kernel-devel | head -n 1))
%define kernel_version %(echo $(rpm -q --qf "\%%{VERSION}" %{kernel_devel_rpm}))
%define kernel_name %(echo $(rpm -q --qf "\%%{VERSION}-\%%{RELEASE}.\%%{ARCH}" %{kernel_devel_rpm})) %define kernel_name %(echo $(rpm -q --qf "\%%{VERSION}-\%%{RELEASE}.\%%{ARCH}" %{kernel_devel_rpm}))
%define pkg_kmod %{name}-kmod
%define pkg_build %{name}-build
############################################ ############################################
############ Package syscare ############### ############ Package syscare ###############
############################################ ############################################
Name: syscare Name: syscare
Version: 1.2.1 Version: 1.2.1
Release: 9 Release: 10
Summary: System hot-fix service Summary: System hot-fix service
License: MulanPSL-2.0 and GPL-2.0-only License: MulanPSL-2.0 and GPL-2.0-only
URL: https://gitee.com/openeuler/syscare URL: https://gitee.com/openeuler/syscare
Source0: %{name}-%{version}.tar.gz Source0: %{name}-%{version}.tar.gz
Patch0001: 0001-upatch-hijacker-fix-compile-bug.patch Patch0001: 0001-upatch-hijacker-fix-compile-bug.patch
Patch0002: 0002-daemon-fix-cannot-get-file-selinux-xattr-when-selinu.patch Patch0002: 0002-daemon-fix-cannot-get-file-selinux-xattr-when-selinu.patch
Patch0003: 0003-syscared-fix-syscare-check-command-does-not-check-sy.patch Patch0003: 0003-syscared-fix-syscare-check-command-does-not-check-sy.patch
Patch0004: 0004-syscared-fix-cannot-find-process-of-dynlib-patch-iss.patch Patch0004: 0004-syscared-fix-cannot-find-process-of-dynlib-patch-iss.patch
Patch0005: 0005-syscared-optimize-patch-error-logic.patch Patch0005: 0005-syscared-optimize-patch-error-logic.patch
Patch0006: 0006-syscared-optimize-transaction-creation-logic.patch Patch0006: 0006-syscared-optimize-transaction-creation-logic.patch
Patch0007: 0007-upatch-manage-optimize-output.patch Patch0007: 0007-upatch-manage-optimize-output.patch
Patch0008: 0008-common-impl-CStr-from_bytes_with_next_nul.patch Patch0008: 0008-common-impl-CStr-from_bytes_with_next_nul.patch
Patch0009: 0009-syscared-improve-patch-management.patch Patch0009: 0009-syscared-improve-patch-management.patch
Patch0010: 0010-syscared-stop-activating-ignored-process-on-new-proc.patch Patch0010: 0010-syscared-stop-activating-ignored-process-on-new-proc.patch
Patch0011: 0011-syscared-adapt-upatch-manage-exit-code-change.patch Patch0011: 0011-syscared-adapt-upatch-manage-exit-code-change.patch
Patch0012: 0012-upatch-manage-change-exit-code.patch Patch0012: 0012-upatch-manage-change-exit-code.patch
Patch0013: 0013-upatch-manage-change-the-way-to-calculate-frozen-tim.patch Patch0013: 0013-upatch-manage-change-the-way-to-calculate-frozen-tim.patch
Patch0014: 0014-abi-change-uuid-string-to-uuid-bytes.patch Patch0014: 0014-abi-change-uuid-string-to-uuid-bytes.patch
Patch0015: 0015-upatch-build-fix-file-detection-cause-build-failure-.patch Patch0015: 0015-upatch-build-fix-file-detection-cause-build-failure-.patch
Patch0016: 0016-upatch-diff-optimize-log-output.patch Patch0016: 0016-upatch-diff-optimize-log-output.patch
Patch0017: 0017-security-change-directory-permission.patch Patch0017: 0017-security-change-directory-permission.patch
Patch0018: 0018-security-change-daemon-socket-permission.patch Patch0018: 0018-security-change-daemon-socket-permission.patch
Patch0019: 0019-upatch-manage-Fixed-the-core-dump-issue-after-applyi.patch Patch0019: 0019-upatch-manage-Fixed-the-core-dump-issue-after-applyi.patch
Patch0020: 0020-upatch-diff-fix-lookup_relf-failed-issue.patch Patch0020: 0020-upatch-diff-fix-lookup_relf-failed-issue.patch
Patch0021: 0021-upatch-diff-only-check-changed-file-symbols.patch Patch0021: 0021-upatch-diff-only-check-changed-file-symbols.patch
Patch0022: 0022-upatch-diff-remove-rela-check-while-build-rebuilding.patch Patch0022: 0022-upatch-diff-remove-rela-check-while-build-rebuilding.patch
Patch0023: 0023-syscared-fix-apply-kernel-module-patch-failure-issue.patch Patch0023: 0023-syscared-fix-apply-kernel-module-patch-failure-issue.patch
Patch0024: 0024-syscare-build-fix-build-oot-module-failure-issue.patch Patch0024: 0024-syscare-build-fix-build-oot-module-failure-issue.patch
Patch0025: 0025-all-finding-executable-from-environment-variables.patch
Patch0026: 0026-all-remove-redundant-code.patch
Patch0027: 0027-abi-reexport-uuid.patch
Patch0028: 0028-all-add-c-rust-compilation-options.patch
Patch0029: 0029-common-fix-failed-to-set-selinux-status-issue.patch
Patch0030: 0030-upatch-diff-exit-with-error-when-any-tls-var-include.patch
Patch0031: 0031-upatch-diff-fix-lookup_relf-duplicate-failure.patch
Patch0032: 0032-upatch-diff-fix-memory-leak.patch
Patch0033: 0033-upatch-hijacker-fix-memory-leak.patch
Patch0034: 0034-upatch-manage-fix-memory-leak.patch
Patch0035: 0035-security-sanitize-sensitive-code.patch
Patch0036: 0036-all-implement-asan-gcov-build-type.patch
Patch0037: 0037-all-clean-code.patch
Patch0038: 0038-syscare-abi-remove-display-limit-of-patch_info.patch
Patch0039: 0039-syscare-abi-fix-clippy-warnings.patch
Patch0040: 0040-update-README.md.patch
Patch0041: 0041-upatch-diff-fix-.rela.text-section-status-bug.patch
Patch0042: 0042-upatch-manage-resolve-plt-firstly.patch
Patch0043: 0043-upatch-manage-fix-find-upatch-region-bug.patch
Patch0044: 0044-update-README.md.patch
Patch0045: 0045-common-fix-normalize-empty-path-return-current-path-.patch
Patch0046: 0046-syscared-Add-PACTCH_CHECK-action-when-status-change-.patch
Patch0047: 0047-all-fix-compile-failure-of-rustc-1.80.patch
BuildRequires: cmake >= 3.14 make BuildRequires: cmake >= 3.14 make
BuildRequires: rust >= 1.51 cargo >= 1.51 BuildRequires: rust >= 1.51 cargo >= 1.51
@ -49,7 +68,7 @@ BuildRequires: kernel-devel
Requires: coreutils systemd Requires: coreutils systemd
Requires: kpatch-runtime Requires: kpatch-runtime
Excludearch: loongarch64 Excludearch: loongarch64
############### Description ################ ############### Description ################
%description %description
@ -117,12 +136,12 @@ fi
################## Files ################### ################## Files ###################
%files %files
%defattr(-,root,root,-) %defattr(-,root,root,0555)
%dir /usr/libexec/syscare %dir /usr/libexec/syscare
%attr(550,root,root) /usr/lib/systemd/system/syscare.service %attr(0555,root,root) /usr/bin/syscare
%attr(550,root,root) /usr/libexec/syscare/upatch-manage %attr(0550,root,root) /usr/bin/syscared
%attr(550,root,root) /usr/bin/syscared %attr(0550,root,root) /usr/lib/systemd/system/syscare.service
%attr(555,root,root) /usr/bin/syscare %attr(0550,root,root) /usr/libexec/syscare/upatch-manage
############################################ ############################################
########## Package syscare-build ########### ########## Package syscare-build ###########
@ -174,26 +193,45 @@ fi
################## Files ################### ################## Files ###################
%files build %files build
%defattr(-,root,root,-) %defattr(-,root,root,0555)
%dir /usr/libexec/syscare %dir /usr/libexec/syscare
%attr(550,root,root) /usr/lib/systemd/system/upatch.service
%attr(550,root,root) /usr/bin/upatchd %attr(550,root,root) /usr/bin/upatchd
%attr(440,root,root) /usr/libexec/syscare/upatch_hijacker.ko
%attr(555,root,root) /usr/libexec/syscare/syscare-build %attr(555,root,root) /usr/libexec/syscare/syscare-build
%attr(555,root,root) /usr/libexec/syscare/upatch-build %attr(555,root,root) /usr/libexec/syscare/upatch-build
%attr(555,root,root) /usr/libexec/syscare/upatch-diff %attr(555,root,root) /usr/libexec/syscare/upatch-diff
%attr(555,root,root) /usr/libexec/syscare/as-hijacker %attr(555,root,root) /usr/libexec/syscare/as-helper
%attr(555,root,root) /usr/libexec/syscare/cc-hijacker %attr(555,root,root) /usr/libexec/syscare/cc-helper
%attr(555,root,root) /usr/libexec/syscare/c++-hijacker %attr(555,root,root) /usr/libexec/syscare/c++-helper
%attr(555,root,root) /usr/libexec/syscare/gcc-hijacker %attr(555,root,root) /usr/libexec/syscare/gcc-helper
%attr(555,root,root) /usr/libexec/syscare/g++-hijacker %attr(555,root,root) /usr/libexec/syscare/g++-helper
%attr(555,root,root) /usr/libexec/syscare/gnu-as-hijacker %attr(555,root,root) /usr/libexec/syscare/gnu-as-helper
%attr(555,root,root) /usr/libexec/syscare/gnu-compiler-hijacker %attr(555,root,root) /usr/libexec/syscare/gnu-compiler-helper
%attr(440,root,root) /usr/libexec/syscare/upatch_helper.ko
%attr(550,root,root) /usr/lib/systemd/system/upatch.service
############################################ ############################################
################ Change log ################ ################ Change log ################
############################################ ############################################
%changelog %changelog
* Fri Aug 16 2024 renoseven<dev@renoseven.net> - 1.2.1-10
- upatch-diff: fix '.rela' '.rela.text' resolving issue
- upatch-manage: fix plt resolving issue
- upatch-manage: fix patch region finding issue
- common: fix normalizing empty path return non-empty issue
- syscared: add check action for [DEACTIVED -> ACTIVED] transition
- abi: remove display limit of patch info
- all: clean code
- all: implement asan gcov build type
- security: sanitize sensitive code
- upatch-manage: fix memory leak
- upatch-helper: fix memory leak
- upatch-diff: fix memory leak
- upatch-diff: fix find duplicate symbol issue
- upatch-diff: prevent tls variable modification
- common: fix failed to set selinux status issue
- all: add compile options
- all: remove redundant code
- all: finding executable from environment variables
* Wed Jul 03 2024 yueyuankun<yueyuankun@kylinos.cn> - 1.2.1-9 * Wed Jul 03 2024 yueyuankun<yueyuankun@kylinos.cn> - 1.2.1-9
- add excludearch loongarch64 - add excludearch loongarch64
* Mon May 20 2024 ningyu<ningyu9@huawei.com> - 1.2.1-8 * Mon May 20 2024 ningyu<ningyu9@huawei.com> - 1.2.1-8