update to 1.2.0-10
Sync patch
This commit is contained in:
parent
13f63b2db3
commit
5909c8dc30
@ -0,0 +1,31 @@
|
|||||||
|
From 92f5334a547ddd7c1a8f787cdde7373965942835 Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Fri, 8 Dec 2023 17:33:00 +0800
|
||||||
|
Subject: [PATCH 01/15] builder: fix 'enabling multiple kpatch may lead
|
||||||
|
soft-lockup' issue
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
builder/src/patch/kernel_patch/kpatch_builder.rs | 6 +++---
|
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/builder/src/patch/kernel_patch/kpatch_builder.rs b/builder/src/patch/kernel_patch/kpatch_builder.rs
|
||||||
|
index d0f58b4..69c0cee 100644
|
||||||
|
--- a/builder/src/patch/kernel_patch/kpatch_builder.rs
|
||||||
|
+++ b/builder/src/patch/kernel_patch/kpatch_builder.rs
|
||||||
|
@@ -212,9 +212,9 @@ impl KernelPatchBuilder {
|
||||||
|
fn parse_kbuild_cmd_envs(&self, build_root: &Path) -> ExternCommandEnvs {
|
||||||
|
ExternCommandEnvs::new()
|
||||||
|
.env("CACHEDIR", build_root)
|
||||||
|
- .env("NO_PROFILING_CALLS", "1")
|
||||||
|
- .env("DISABLE_AFTER_LOAD", "1")
|
||||||
|
- .env("KEEP_JUMP_LABEL", "1")
|
||||||
|
+ .env("NO_PROFILING_CALLS", "yes")
|
||||||
|
+ .env("DISABLE_AFTER_LOAD", "yes")
|
||||||
|
+ .env("KEEP_JUMP_LABEL", "yes")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn invoke_kpatch_build(
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
2203
0002-upatch-fix-upatch-manage-detach-failure-issue.patch
Normal file
2203
0002-upatch-fix-upatch-manage-detach-failure-issue.patch
Normal file
File diff suppressed because it is too large
Load Diff
70
0003-upatch-remove-upatch-manage-log-file.patch
Normal file
70
0003-upatch-remove-upatch-manage-log-file.patch
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
From bad9504ed575d86dd93ffcfdd466827cc3b3dadb Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Wed, 20 Dec 2023 10:46:44 +0800
|
||||||
|
Subject: [PATCH 03/15] upatch: remove upatch manage log file
|
||||||
|
|
||||||
|
1. remove /tmp/upatch-manage.log
|
||||||
|
2. print log to stdout
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
upatch/upatch-manage/log.h | 3 +--
|
||||||
|
upatch/upatch-manage/upatch-manage.c | 8 --------
|
||||||
|
2 files changed, 1 insertion(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/upatch/upatch-manage/log.h b/upatch/upatch-manage/log.h
|
||||||
|
index 4d1fd7a..80fed3a 100644
|
||||||
|
--- a/upatch/upatch-manage/log.h
|
||||||
|
+++ b/upatch/upatch-manage/log.h
|
||||||
|
@@ -30,7 +30,6 @@
|
||||||
|
/* Files that include log.h must define loglevel and logprefix */
|
||||||
|
extern enum loglevel loglevel;
|
||||||
|
extern char *logprefix;
|
||||||
|
-extern FILE *upatch_manage_log_fd;
|
||||||
|
|
||||||
|
enum exit_status {
|
||||||
|
EXIT_STATUS_SUCCESS = 0,
|
||||||
|
@@ -58,7 +57,7 @@ enum exit_status {
|
||||||
|
#define log(level, format, ...) \
|
||||||
|
({ \
|
||||||
|
if (loglevel <= (level)) \
|
||||||
|
- fprintf(upatch_manage_log_fd, format, ##__VA_ARGS__); \
|
||||||
|
+ printf(format, ##__VA_ARGS__); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define REQUIRE(COND, message) \
|
||||||
|
diff --git a/upatch/upatch-manage/upatch-manage.c b/upatch/upatch-manage/upatch-manage.c
|
||||||
|
index b36ff0d..a109db7 100644
|
||||||
|
--- a/upatch/upatch-manage/upatch-manage.c
|
||||||
|
+++ b/upatch/upatch-manage/upatch-manage.c
|
||||||
|
@@ -124,8 +124,6 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state)
|
||||||
|
|
||||||
|
static struct argp argp = { options, parse_opt, args_doc, program_doc };
|
||||||
|
|
||||||
|
-FILE *upatch_manage_log_fd = NULL;
|
||||||
|
-
|
||||||
|
int patch_upatch(const char *uuid, const char *binary_path, const char *upatch_path, int pid)
|
||||||
|
{
|
||||||
|
struct upatch_elf uelf;
|
||||||
|
@@ -184,11 +182,6 @@ int main(int argc, char *argv[])
|
||||||
|
struct arguments args;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- upatch_manage_log_fd = fopen("/tmp/upatch-manage.log", "w");
|
||||||
|
- if (upatch_manage_log_fd < 0) {
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
memset(&args, 0, sizeof(struct arguments));
|
||||||
|
argp_parse(&argp, argc, argv, 0, NULL, &args);
|
||||||
|
if (args.verbose) {
|
||||||
|
@@ -217,6 +210,5 @@ int main(int argc, char *argv[])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- fclose(upatch_manage_log_fd);
|
||||||
|
return abs(ret);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
25
0004-upatch-remove-redudant-log-output.patch
Normal file
25
0004-upatch-remove-redudant-log-output.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
From 295f6f406b86b70142bed9b17abc56b72962ac3d Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Wed, 20 Dec 2023 12:18:11 +0800
|
||||||
|
Subject: [PATCH 04/15] upatch: remove redudant log output
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
upatch/upatch-tool/upatch-meta.c | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/upatch/upatch-tool/upatch-meta.c b/upatch/upatch-tool/upatch-meta.c
|
||||||
|
index cf60cff..c625115 100644
|
||||||
|
--- a/upatch/upatch-tool/upatch-meta.c
|
||||||
|
+++ b/upatch/upatch-tool/upatch-meta.c
|
||||||
|
@@ -573,7 +573,6 @@ patch_status_e meta_get_patch_status(const char *uuid)
|
||||||
|
}
|
||||||
|
patch = find_patch_by_uuid(uuid);
|
||||||
|
if (patch == NULL) {
|
||||||
|
- log_warn("can't find patch uuid:%s failed to get status\n", uuid);
|
||||||
|
return UPATCH_PATCH_STATUS_NOT_APPLIED;
|
||||||
|
}
|
||||||
|
return patch->status;
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
32
0005-upatch-manage-close-dup-fd.patch
Normal file
32
0005-upatch-manage-close-dup-fd.patch
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
From 532e5680087cc1a69f88692c31e523e2eab70145 Mon Sep 17 00:00:00 2001
|
||||||
|
From: ningyu <405888464@qq.com>
|
||||||
|
Date: Wed, 20 Dec 2023 15:34:13 +0800
|
||||||
|
Subject: [PATCH 05/15] upatch-manage: close dup fd
|
||||||
|
|
||||||
|
---
|
||||||
|
upatch/upatch-manage/upatch-process.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/upatch/upatch-manage/upatch-process.c b/upatch/upatch-manage/upatch-process.c
|
||||||
|
index aeb5705..2216db2 100644
|
||||||
|
--- a/upatch/upatch-manage/upatch-process.c
|
||||||
|
+++ b/upatch/upatch-manage/upatch-process.c
|
||||||
|
@@ -518,6 +518,7 @@ int upatch_process_parse_proc_maps(struct upatch_process *proc)
|
||||||
|
|
||||||
|
} while (1);
|
||||||
|
fclose(f);
|
||||||
|
+ close(fd);
|
||||||
|
|
||||||
|
log_debug("Found %d object file(s)\n", proc->num_objs);
|
||||||
|
|
||||||
|
@@ -531,6 +532,7 @@ int upatch_process_parse_proc_maps(struct upatch_process *proc)
|
||||||
|
|
||||||
|
error:
|
||||||
|
fclose(f);
|
||||||
|
+ close(fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
252
0006-daemon-check-patch-before-patch-restoration.patch
Normal file
252
0006-daemon-check-patch-before-patch-restoration.patch
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
From fdb0d2ab35085bd97d5cae420df0a2c9c6f99c0a Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Fri, 22 Dec 2023 13:40:29 +0800
|
||||||
|
Subject: [PATCH 06/15] daemon: check patch before patch restoration
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
daemon/src/patch/manager/driver/kpatch/mod.rs | 37 +++++++++---
|
||||||
|
daemon/src/patch/manager/driver/mod.rs | 2 +-
|
||||||
|
daemon/src/patch/manager/driver/upatch/mod.rs | 58 +++++++++++++------
|
||||||
|
daemon/src/patch/manager/mod.rs | 3 +-
|
||||||
|
daemon/src/patch/transaction.rs | 2 +-
|
||||||
|
daemon/src/rpc/skeleton_impl/patch.rs | 2 +-
|
||||||
|
6 files changed, 73 insertions(+), 31 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemon/src/patch/manager/driver/kpatch/mod.rs b/daemon/src/patch/manager/driver/kpatch/mod.rs
|
||||||
|
index 57aa127..efe80e5 100644
|
||||||
|
--- a/daemon/src/patch/manager/driver/kpatch/mod.rs
|
||||||
|
+++ b/daemon/src/patch/manager/driver/kpatch/mod.rs
|
||||||
|
@@ -2,7 +2,7 @@ use std::{ffi::OsString, os::unix::prelude::OsStrExt, path::Path};
|
||||||
|
|
||||||
|
use anyhow::{anyhow, bail, ensure, Context, Result};
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
-use log::{debug, warn};
|
||||||
|
+use log::debug;
|
||||||
|
|
||||||
|
use syscare_abi::PatchStatus;
|
||||||
|
use syscare_common::{
|
||||||
|
@@ -87,15 +87,10 @@ impl KernelPatchDriver {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-impl PatchDriver for KernelPatchDriver {
|
||||||
|
- fn check(&self, patch: &Patch, flag: PatchOpFlag) -> Result<()> {
|
||||||
|
+impl KernelPatchDriver {
|
||||||
|
+ fn check_compatiblity(&self, patch: &Patch) -> Result<()> {
|
||||||
|
const KERNEL_NAME_PREFIX: &str = "kernel-";
|
||||||
|
|
||||||
|
- if flag == PatchOpFlag::SkipCheck {
|
||||||
|
- warn!("Skipped patch \"{}\" check", patch);
|
||||||
|
- return Ok(());
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
let kernel_version = os::kernel::version();
|
||||||
|
let current_kernel = OsString::from(KERNEL_NAME_PREFIX).concat(kernel_version);
|
||||||
|
|
||||||
|
@@ -113,18 +108,42 @@ impl PatchDriver for KernelPatchDriver {
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ Ok(())
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ fn check_consistency(&self, patch: &Patch) -> Result<()> {
|
||||||
|
let patch_ext: &KernelPatchExt = (&patch.info_ext).into();
|
||||||
|
let patch_file = patch_ext.patch_file.as_path();
|
||||||
|
let real_checksum = digest::file(patch_file)?;
|
||||||
|
+ debug!("Target checksum: {}", patch.checksum);
|
||||||
|
+ debug!("Expected checksum: {}", real_checksum);
|
||||||
|
+
|
||||||
|
ensure!(
|
||||||
|
patch.checksum.eq(&real_checksum),
|
||||||
|
- "Kpatch: Patch file \"{}\" checksum failed",
|
||||||
|
+ "Kpatch: Patch \"{}\" consistency check failed",
|
||||||
|
patch_file.display()
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
+ fn check_confliction(&self, _patch: &Patch) -> Result<()> {
|
||||||
|
+ Ok(())
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+impl PatchDriver for KernelPatchDriver {
|
||||||
|
+ fn check(&self, patch: &Patch, flag: PatchOpFlag) -> Result<()> {
|
||||||
|
+ self.check_compatiblity(patch)?;
|
||||||
|
+ self.check_consistency(patch)?;
|
||||||
|
+
|
||||||
|
+ if flag != PatchOpFlag::Force {
|
||||||
|
+ self.check_confliction(patch)?;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ Ok(())
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
fn status(&self, patch: &Patch, _flag: PatchOpFlag) -> Result<PatchStatus> {
|
||||||
|
Self::get_patch_status(patch)
|
||||||
|
}
|
||||||
|
diff --git a/daemon/src/patch/manager/driver/mod.rs b/daemon/src/patch/manager/driver/mod.rs
|
||||||
|
index 9beb999..c3a4ca4 100644
|
||||||
|
--- a/daemon/src/patch/manager/driver/mod.rs
|
||||||
|
+++ b/daemon/src/patch/manager/driver/mod.rs
|
||||||
|
@@ -13,7 +13,7 @@ use super::entity::*;
|
||||||
|
#[derive(PartialEq, Clone, Copy)]
|
||||||
|
pub enum PatchOpFlag {
|
||||||
|
Normal,
|
||||||
|
- SkipCheck,
|
||||||
|
+ Force,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Basic abstraction of patch operation
|
||||||
|
diff --git a/daemon/src/patch/manager/driver/upatch/mod.rs b/daemon/src/patch/manager/driver/upatch/mod.rs
|
||||||
|
index 993c116..e4a914b 100644
|
||||||
|
--- a/daemon/src/patch/manager/driver/upatch/mod.rs
|
||||||
|
+++ b/daemon/src/patch/manager/driver/upatch/mod.rs
|
||||||
|
@@ -1,6 +1,5 @@
|
||||||
|
use std::{
|
||||||
|
- ffi::OsString,
|
||||||
|
- os::unix::prelude::OsStringExt,
|
||||||
|
+ ffi::CStr,
|
||||||
|
path::{Path, PathBuf},
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -9,7 +8,7 @@ use anyhow::{anyhow, bail, ensure, Result};
|
||||||
|
use indexmap::IndexMap;
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
use libc::{c_char, EEXIST, EFAULT, ENOENT, EPERM};
|
||||||
|
-use log::{info, warn};
|
||||||
|
+use log::{debug, info};
|
||||||
|
use parking_lot::Mutex;
|
||||||
|
use syscare_abi::PatchStatus;
|
||||||
|
use syscare_common::util::digest;
|
||||||
|
@@ -92,25 +91,33 @@ impl UserPatchDriver {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-impl PatchDriver for UserPatchDriver {
|
||||||
|
- fn check(&self, patch: &Patch, flag: PatchOpFlag) -> Result<()> {
|
||||||
|
- const ERR_MSG_LEN: usize = 512;
|
||||||
|
-
|
||||||
|
- if flag == PatchOpFlag::SkipCheck {
|
||||||
|
- warn!("Skipped patch \"{}\" check", patch);
|
||||||
|
- return Ok(());
|
||||||
|
- }
|
||||||
|
+impl UserPatchDriver {
|
||||||
|
+ fn check_compatiblity(&self, _patch: &Patch) -> Result<()> {
|
||||||
|
+ Ok(())
|
||||||
|
+ }
|
||||||
|
|
||||||
|
+ fn check_consistency(&self, patch: &Patch) -> Result<()> {
|
||||||
|
let patch_ext: &UserPatchExt = (&patch.info_ext).into();
|
||||||
|
let patch_file = &patch_ext.patch_file;
|
||||||
|
|
||||||
|
let real_checksum = digest::file(patch_file).map_err(|e| anyhow!("Upatch: {}", e))?;
|
||||||
|
+ debug!("Target checksum: {}", patch.checksum);
|
||||||
|
+ debug!("Expected checksum: {}", real_checksum);
|
||||||
|
+
|
||||||
|
ensure!(
|
||||||
|
patch.checksum.eq(&real_checksum),
|
||||||
|
- "Upatch: Patch file \"{}\" checksum failed",
|
||||||
|
+ "Upatch: Patch \"{}\" consistency check failed",
|
||||||
|
patch_file.display()
|
||||||
|
);
|
||||||
|
|
||||||
|
+ Ok(())
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ fn check_confliction(&self, patch: &Patch) -> Result<()> {
|
||||||
|
+ const ERR_MSG_LEN: usize = 512;
|
||||||
|
+
|
||||||
|
+ let patch_ext: &UserPatchExt = (&patch.info_ext).into();
|
||||||
|
+
|
||||||
|
let target_elf = patch_ext.target_elf.to_cstring()?;
|
||||||
|
let patch_file = patch_ext.patch_file.to_cstring()?;
|
||||||
|
let mut msg_buf = vec![0; ERR_MSG_LEN];
|
||||||
|
@@ -123,11 +130,28 @@ impl PatchDriver for UserPatchDriver {
|
||||||
|
msg_buf.capacity(),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
+ if ret_val != 0 {
|
||||||
|
+ match CStr::from_bytes_until_nul(&msg_buf) {
|
||||||
|
+ Ok(err_msg) => bail!(format!("Upatch: {}", err_msg.to_string_lossy())),
|
||||||
|
+ Err(_) => bail!(format!(
|
||||||
|
+ "Upatch: {}",
|
||||||
|
+ std::io::Error::from_raw_os_error(ret_val)
|
||||||
|
+ )),
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- ensure!(
|
||||||
|
- ret_val == 0,
|
||||||
|
- OsString::from_vec(msg_buf).to_string_lossy().to_string()
|
||||||
|
- );
|
||||||
|
+ Ok(())
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+impl PatchDriver for UserPatchDriver {
|
||||||
|
+ fn check(&self, patch: &Patch, flag: PatchOpFlag) -> Result<()> {
|
||||||
|
+ self.check_compatiblity(patch)?;
|
||||||
|
+ self.check_consistency(patch)?;
|
||||||
|
+
|
||||||
|
+ if flag != PatchOpFlag::Force {
|
||||||
|
+ self.check_confliction(patch)?;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
@@ -151,7 +175,7 @@ impl PatchDriver for UserPatchDriver {
|
||||||
|
patch_uuid.as_ptr(),
|
||||||
|
target_elf.as_ptr(),
|
||||||
|
patch_file.as_ptr(),
|
||||||
|
- matches!(flag, PatchOpFlag::SkipCheck),
|
||||||
|
+ matches!(flag, PatchOpFlag::Force),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/daemon/src/patch/manager/mod.rs b/daemon/src/patch/manager/mod.rs
|
||||||
|
index 3b1aa8c..fdb218d 100644
|
||||||
|
--- a/daemon/src/patch/manager/mod.rs
|
||||||
|
+++ b/daemon/src/patch/manager/mod.rs
|
||||||
|
@@ -267,8 +267,7 @@ impl PatchManager {
|
||||||
|
"Restore patch \"{}\" status to \"{}\"",
|
||||||
|
patch, target_status
|
||||||
|
);
|
||||||
|
- if let Err(e) = self.do_status_transition(&patch, target_status, PatchOpFlag::SkipCheck)
|
||||||
|
- {
|
||||||
|
+ if let Err(e) = self.do_status_transition(&patch, target_status, PatchOpFlag::Force) {
|
||||||
|
error!("{}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/daemon/src/patch/transaction.rs b/daemon/src/patch/transaction.rs
|
||||||
|
index 16bab46..079b024 100644
|
||||||
|
--- a/daemon/src/patch/transaction.rs
|
||||||
|
+++ b/daemon/src/patch/transaction.rs
|
||||||
|
@@ -70,7 +70,7 @@ where
|
||||||
|
fn rollback(&mut self) -> Result<()> {
|
||||||
|
let mut patch_manager = self.patch_manager.write();
|
||||||
|
while let Some((patch, status)) = self.finish_list.pop() {
|
||||||
|
- patch_manager.do_status_transition(&patch, status, PatchOpFlag::SkipCheck)?;
|
||||||
|
+ patch_manager.do_status_transition(&patch, status, PatchOpFlag::Force)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
diff --git a/daemon/src/rpc/skeleton_impl/patch.rs b/daemon/src/rpc/skeleton_impl/patch.rs
|
||||||
|
index 4517a03..8d4f57b 100644
|
||||||
|
--- a/daemon/src/rpc/skeleton_impl/patch.rs
|
||||||
|
+++ b/daemon/src/rpc/skeleton_impl/patch.rs
|
||||||
|
@@ -82,7 +82,7 @@ impl PatchSkeleton for PatchSkeletonImpl {
|
||||||
|
PatchManager::apply_patch,
|
||||||
|
match force {
|
||||||
|
false => PatchOpFlag::Normal,
|
||||||
|
- true => PatchOpFlag::SkipCheck,
|
||||||
|
+ true => PatchOpFlag::Force,
|
||||||
|
},
|
||||||
|
identifier,
|
||||||
|
)?
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
217
0007-upatch-elf-verification.patch
Normal file
217
0007-upatch-elf-verification.patch
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
From 727ece331961c5a495350b38afa982f1598e5b82 Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Fri, 22 Dec 2023 13:45:48 +0800
|
||||||
|
Subject: [PATCH 07/15] upatch: elf verification
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
daemon/src/patch/manager/driver/upatch/mod.rs | 4 +-
|
||||||
|
upatch/upatch-manage/upatch-elf.c | 7 ++
|
||||||
|
upatch/upatch-tool/log.h | 1 +
|
||||||
|
upatch/upatch-tool/upatch-elf.c | 102 ++++++++++--------
|
||||||
|
upatch/upatch-tool/upatch-tool-lib.c | 9 +-
|
||||||
|
5 files changed, 72 insertions(+), 51 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemon/src/patch/manager/driver/upatch/mod.rs b/daemon/src/patch/manager/driver/upatch/mod.rs
|
||||||
|
index e4a914b..4d06e84 100644
|
||||||
|
--- a/daemon/src/patch/manager/driver/upatch/mod.rs
|
||||||
|
+++ b/daemon/src/patch/manager/driver/upatch/mod.rs
|
||||||
|
@@ -7,7 +7,7 @@ use anyhow::{anyhow, bail, ensure, Result};
|
||||||
|
|
||||||
|
use indexmap::IndexMap;
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
-use libc::{c_char, EEXIST, EFAULT, ENOENT, EPERM};
|
||||||
|
+use libc::{c_char, EEXIST, EFAULT, ENOENT, ENOEXEC, EPERM};
|
||||||
|
use log::{debug, info};
|
||||||
|
use parking_lot::Mutex;
|
||||||
|
use syscare_abi::PatchStatus;
|
||||||
|
@@ -182,7 +182,7 @@ impl PatchDriver for UserPatchDriver {
|
||||||
|
match ret_val {
|
||||||
|
0 => Ok(()),
|
||||||
|
EPERM => bail!("Upatch: Operation not permitted"),
|
||||||
|
- ENOENT => bail!("Upatch: Patch symbol is empty"),
|
||||||
|
+ ENOEXEC => bail!("Upatch: Patch format error"),
|
||||||
|
EEXIST => bail!("Upatch: Patch is already exist"),
|
||||||
|
_ => bail!("Upatch: {}", std::io::Error::from_raw_os_error(ret_val)),
|
||||||
|
}
|
||||||
|
diff --git a/upatch/upatch-manage/upatch-elf.c b/upatch/upatch-manage/upatch-elf.c
|
||||||
|
index 2bd3175..31180b5 100644
|
||||||
|
--- a/upatch/upatch-manage/upatch-elf.c
|
||||||
|
+++ b/upatch/upatch-manage/upatch-elf.c
|
||||||
|
@@ -67,6 +67,13 @@ static int open_elf(struct elf_info *einfo, const char *name)
|
||||||
|
einfo->shdrs = (void *)einfo->hdr + einfo->hdr->e_shoff;
|
||||||
|
einfo->shstrtab = (void *)einfo->hdr + einfo->shdrs[einfo->hdr->e_shstrndx].sh_offset;
|
||||||
|
|
||||||
|
+ void *einfo_eof = einfo->hdr + einfo->patch_size;
|
||||||
|
+ if ((void *)einfo->shdrs > einfo_eof || (void *)einfo->shstrtab > einfo_eof) {
|
||||||
|
+ log_error("File '%s' is not a valid elf\n", name);
|
||||||
|
+ ret = -ENOEXEC;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
for (i = 0; i < einfo->hdr->e_shnum; ++i) {
|
||||||
|
sec_name = einfo->shstrtab + einfo->shdrs[i].sh_name;
|
||||||
|
if (streql(sec_name, BUILD_ID_NAME) && einfo->shdrs[i].sh_type == SHT_NOTE) {
|
||||||
|
diff --git a/upatch/upatch-tool/log.h b/upatch/upatch-tool/log.h
|
||||||
|
index 75213d8..e42e290 100644
|
||||||
|
--- a/upatch/upatch-tool/log.h
|
||||||
|
+++ b/upatch/upatch-tool/log.h
|
||||||
|
@@ -11,5 +11,6 @@
|
||||||
|
#define log_debug(format, ...) log(DEBUG, format, ##__VA_ARGS__)
|
||||||
|
#define log_normal(format, ...) log(NORMAL, format, ##__VA_ARGS__)
|
||||||
|
#define log_warn(format, ...) log(WARN, format, ##__VA_ARGS__)
|
||||||
|
+#define log_error(format, ...) log(ERR, format, ##__VA_ARGS__)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
diff --git a/upatch/upatch-tool/upatch-elf.c b/upatch/upatch-tool/upatch-elf.c
|
||||||
|
index 5b9b0bd..def536c 100644
|
||||||
|
--- a/upatch/upatch-tool/upatch-elf.c
|
||||||
|
+++ b/upatch/upatch-tool/upatch-elf.c
|
||||||
|
@@ -44,53 +44,65 @@ out:
|
||||||
|
|
||||||
|
static int open_elf(struct elf_info *einfo, const char *name)
|
||||||
|
{
|
||||||
|
- int ret = 0, fd = -1, i;
|
||||||
|
- char *sec_name;
|
||||||
|
- struct stat st;
|
||||||
|
-
|
||||||
|
- // TODO: check ELF
|
||||||
|
- fd = open(name, O_RDONLY);
|
||||||
|
- if (fd == -1)
|
||||||
|
- log_warn("open %s failed with errno %d \n", name, errno);
|
||||||
|
+ int ret = 0, fd = -1, i;
|
||||||
|
+ char *sec_name;
|
||||||
|
+ struct stat st;
|
||||||
|
+
|
||||||
|
+ fd = open(name, O_RDONLY);
|
||||||
|
+ if (fd == -1) {
|
||||||
|
+ ret = -errno;
|
||||||
|
+ log_error("Failed to open file '%s', ret=%d\n", name, ret);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = stat(name, &st);
|
||||||
|
+ if (ret != 0) {
|
||||||
|
+ ret = -errno;
|
||||||
|
+ log_error("Failed to stat file '%s', ret=%d\n", name, ret);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = read_from_offset(fd, (void **)&einfo->patch_buff, st.st_size, 0);
|
||||||
|
+ if (ret != 0) {
|
||||||
|
+ log_error("Failed to read file '%s', ret=%d\n", name, ret);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ einfo->name = name;
|
||||||
|
+ einfo->inode = st.st_ino;
|
||||||
|
+ einfo->patch_size = st.st_size;
|
||||||
|
+ einfo->hdr = (void *)einfo->patch_buff;
|
||||||
|
+ einfo->shdrs = (void *)einfo->hdr + einfo->hdr->e_shoff;
|
||||||
|
+ einfo->shstrtab = (void *)einfo->hdr + einfo->shdrs[einfo->hdr->e_shstrndx].sh_offset;
|
||||||
|
+
|
||||||
|
+ void *einfo_eof = einfo->hdr + einfo->patch_size;
|
||||||
|
+ if ((void *)einfo->shdrs > einfo_eof || (void *)einfo->shstrtab > einfo_eof) {
|
||||||
|
+ log_error("File '%s' is not a valid elf\n", name);
|
||||||
|
+ ret = -ENOEXEC;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < einfo->hdr->e_shnum; ++i) {
|
||||||
|
+ sec_name = einfo->shstrtab + einfo->shdrs[i].sh_name;
|
||||||
|
+ if (streql(sec_name, BUILD_ID_NAME) && einfo->shdrs[i].sh_type == SHT_NOTE) {
|
||||||
|
+ einfo->num_build_id = i;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (einfo->num_build_id == 0) {
|
||||||
|
+ ret = -EINVAL;
|
||||||
|
+ log_error("Cannot find section '%s'\n", BUILD_ID_NAME);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = 0;
|
||||||
|
|
||||||
|
- ret = stat(name, &st);
|
||||||
|
- if (ret)
|
||||||
|
- log_warn("get %s stat failed with errno %d \n", name, errno);
|
||||||
|
-
|
||||||
|
- ret = read_from_offset(fd, (void **)&einfo->patch_buff, st.st_size, 0);
|
||||||
|
- if (ret)
|
||||||
|
- goto out;
|
||||||
|
-
|
||||||
|
- einfo->name = name;
|
||||||
|
- einfo->inode = st.st_ino;
|
||||||
|
- einfo->patch_size = st.st_size;
|
||||||
|
- einfo->hdr = (void *)einfo->patch_buff;
|
||||||
|
- einfo->shdrs = (void *)einfo->hdr + einfo->hdr->e_shoff;
|
||||||
|
- einfo->shstrtab = (void *)einfo->hdr +
|
||||||
|
- einfo->shdrs[einfo->hdr->e_shstrndx].sh_offset;
|
||||||
|
-
|
||||||
|
- for (i = 0; i < einfo->hdr->e_shnum; ++i) {
|
||||||
|
- sec_name = einfo->shstrtab + einfo->shdrs[i].sh_name;
|
||||||
|
- if (streql(sec_name, BUILD_ID_NAME) &&
|
||||||
|
- einfo->shdrs[i].sh_type == SHT_NOTE) {
|
||||||
|
- einfo->num_build_id = i;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (einfo->num_build_id == 0) {
|
||||||
|
- ret = EINVAL;
|
||||||
|
- log_warn("no %s found \n", BUILD_ID_NAME);
|
||||||
|
- goto out;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- log_warn("no %ld found \n", einfo->inode);
|
||||||
|
-
|
||||||
|
- ret = 0;
|
||||||
|
out:
|
||||||
|
- if (fd != -1)
|
||||||
|
- close(fd);
|
||||||
|
- return ret;
|
||||||
|
+ if (fd > 0) {
|
||||||
|
+ close(fd);
|
||||||
|
+ }
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int upatch_init(struct upatch_elf *uelf, const char *name)
|
||||||
|
diff --git a/upatch/upatch-tool/upatch-tool-lib.c b/upatch/upatch-tool/upatch-tool-lib.c
|
||||||
|
index 4f816bb..4e5bda1 100644
|
||||||
|
--- a/upatch/upatch-tool/upatch-tool-lib.c
|
||||||
|
+++ b/upatch/upatch-tool/upatch-tool-lib.c
|
||||||
|
@@ -22,7 +22,8 @@ int upatch_check(const char *target_elf, const char *patch_file, char *err_msg,
|
||||||
|
{
|
||||||
|
struct list_head *patch_syms = patch_symbols_resolve(target_elf, patch_file);
|
||||||
|
if (patch_syms == NULL) {
|
||||||
|
- return ENOENT;
|
||||||
|
+ snprintf(err_msg, max_len, "Patch format error");
|
||||||
|
+ return ENOEXEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct list_head *collision_list = meta_get_symbol_collision(target_elf, patch_syms);
|
||||||
|
@@ -30,7 +31,7 @@ int upatch_check(const char *target_elf, const char *patch_file, char *err_msg,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- int offset = snprintf(err_msg, max_len, "Upatch: Patch is conflicted with ");
|
||||||
|
+ int offset = snprintf(err_msg, max_len, "Patch is conflicted with ");
|
||||||
|
symbol_collision *collision = NULL;
|
||||||
|
list_for_each_entry(collision, collision_list, self) {
|
||||||
|
err_msg += offset;
|
||||||
|
@@ -61,8 +62,8 @@ int upatch_load(const char *uuid, const char *target, const char *patch, bool fo
|
||||||
|
// Resolve patch symbols
|
||||||
|
struct list_head *patch_syms = patch_symbols_resolve(target, patch);
|
||||||
|
if (patch_syms == NULL) {
|
||||||
|
- log_warn("{%s}: Patch symbol is empty\n", uuid);
|
||||||
|
- return ENOENT;
|
||||||
|
+ log_warn("{%s}: Patch format error\n", uuid);
|
||||||
|
+ return ENOEXEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check patch symbol collision
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
42
0008-upatch-check-build-id.patch
Normal file
42
0008-upatch-check-build-id.patch
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
From b23af1223e0a284a6dd603ed21c60612170d6767 Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Mon, 18 Dec 2023 18:34:52 +0800
|
||||||
|
Subject: [PATCH 08/15] upatch: check build id
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
upatch/upatch-tool/upatch-resolve.c | 8 ++++++--
|
||||||
|
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/upatch/upatch-tool/upatch-resolve.c b/upatch/upatch-tool/upatch-resolve.c
|
||||||
|
index d12bdae..aeb655c 100644
|
||||||
|
--- a/upatch/upatch-tool/upatch-resolve.c
|
||||||
|
+++ b/upatch/upatch-tool/upatch-resolve.c
|
||||||
|
@@ -65,18 +65,22 @@ struct list_head* patch_symbols_resolve(const char *target_elf, const char *patc
|
||||||
|
INIT_LIST_HEAD(head);
|
||||||
|
|
||||||
|
int ret = upatch_init(&uelf, patch_file);
|
||||||
|
-
|
||||||
|
if (ret < 0) {
|
||||||
|
log_warn("upatch-resolve: upatch_init failed\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = binary_init(&relf, target_elf);
|
||||||
|
- if (ret) {
|
||||||
|
+ if (ret < 0) {
|
||||||
|
log_warn("upatch-resolve: binary_init failed %d \n", ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (check_build_id(&uelf.info, &relf.info) == false) {
|
||||||
|
+ log_error("upatch-resolve: Build id mismatched!\n");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
uelf.relf = &relf;
|
||||||
|
upatch_shdr = &uelf.info.shdrs[uelf.index.upatch_funcs];
|
||||||
|
upatch_funcs = uelf.info.patch_buff + upatch_shdr->sh_offset;
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
38
0009-README-add-example-for-kernel-module-patch-build.patch
Normal file
38
0009-README-add-example-for-kernel-module-patch-build.patch
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
From bbfe75e66815319360af6e3773d78862ee7e65cc Mon Sep 17 00:00:00 2001
|
||||||
|
From: ningyu <ningyu9@huawei.com>
|
||||||
|
Date: Fri, 22 Dec 2023 06:33:51 +0000
|
||||||
|
Subject: [PATCH 09/15] README: add example for kernel module patch build
|
||||||
|
|
||||||
|
---
|
||||||
|
README.md | 15 ++++++++++++++-
|
||||||
|
1 file changed, 14 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/README.md b/README.md
|
||||||
|
index 6c3728b..e86d063 100644
|
||||||
|
--- a/README.md
|
||||||
|
+++ b/README.md
|
||||||
|
@@ -63,7 +63,20 @@ $ syscare build \
|
||||||
|
--source ./redis-6.2.5-1.src.rpm \
|
||||||
|
--debuginfo ./redis-debuginfo-6.2.5-1.x86_64.rpm \
|
||||||
|
--output ./output \
|
||||||
|
- ./0001-Prevent-unauthenticated-client-from-easily-consuming.patch
|
||||||
|
+ --patch ./0001-Prevent-unauthenticated-client-from-easily-consuming.patch
|
||||||
|
+```
|
||||||
|
+
|
||||||
|
+### 内核模块热补丁制作
|
||||||
|
+```
|
||||||
|
+$ syscare build \
|
||||||
|
+ --patch-name HP001 \
|
||||||
|
+ --source ./kernel-5.10.0-60.91.0.115.src.rpm \
|
||||||
|
+ --source ./testmod-1-1.src.rpm \
|
||||||
|
+ --debuginfo ./kernel-debuginfo-5.10.0-60.91.0.115.aarch64.rpm \
|
||||||
|
+ --output ./output \
|
||||||
|
+ --verbose \
|
||||||
|
+ --skip-cleanup \
|
||||||
|
+ --patch ./0001-test.patch
|
||||||
|
```
|
||||||
|
|
||||||
|
补丁制作详细使用说明请见[build/README.md](https://gitee.com/openeuler/syscare/blob/master/build/README.md)
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
41
0010-daemon-fix-check-build-id-logic.patch
Normal file
41
0010-daemon-fix-check-build-id-logic.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
From ed7492d5090a249c50c49501e8865c05de481c94 Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Fri, 22 Dec 2023 15:22:03 +0800
|
||||||
|
Subject: [PATCH 10/15] daemon: fix check build id logic
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
upatch/upatch-tool/upatch-elf.c | 17 ++++++++++++-----
|
||||||
|
1 file changed, 12 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/upatch/upatch-tool/upatch-elf.c b/upatch/upatch-tool/upatch-elf.c
|
||||||
|
index def536c..730c3bd 100644
|
||||||
|
--- a/upatch/upatch-tool/upatch-elf.c
|
||||||
|
+++ b/upatch/upatch-tool/upatch-elf.c
|
||||||
|
@@ -201,11 +201,18 @@ out:
|
||||||
|
|
||||||
|
bool check_build_id(struct elf_info *uelf, struct elf_info *relf)
|
||||||
|
{
|
||||||
|
- return uelf->shdrs[uelf->num_build_id].sh_size ==
|
||||||
|
- relf->shdrs[relf->num_build_id].sh_size &&
|
||||||
|
- !memcmp(uelf->hdr + uelf->shdrs[uelf->num_build_id].sh_offset,
|
||||||
|
- relf->hdr + relf->shdrs[relf->num_build_id].sh_offset,
|
||||||
|
- uelf->shdrs[uelf->num_build_id].sh_size);
|
||||||
|
+ if (uelf->shdrs[uelf->num_build_id].sh_size != relf->shdrs[relf->num_build_id].sh_size) {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ void* uelf_build_id = (void *)uelf->hdr + uelf->shdrs[uelf->num_build_id].sh_offset;
|
||||||
|
+ void* relf_build_id = (void *)relf->hdr + relf->shdrs[relf->num_build_id].sh_offset;
|
||||||
|
+ size_t build_id_len = uelf->shdrs[uelf->num_build_id].sh_size;
|
||||||
|
+
|
||||||
|
+ if (memcmp(uelf_build_id, relf_build_id, build_id_len) != 0) {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void binary_close(struct running_elf *relf)
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
40
0011-upatch-diff-fix-a-nullptr-issue.patch
Normal file
40
0011-upatch-diff-fix-a-nullptr-issue.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From b4a11e983c78d7f856a551e058b84c0ea4bde8c7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Mon, 18 Dec 2023 20:20:19 +0800
|
||||||
|
Subject: [PATCH 11/15] upatch-diff: fix a nullptr issue
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
upatch/upatch-diff/elf-correlate.c | 8 +++++---
|
||||||
|
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/upatch/upatch-diff/elf-correlate.c b/upatch/upatch-diff/elf-correlate.c
|
||||||
|
index 2dd665c..0773016 100644
|
||||||
|
--- a/upatch/upatch-diff/elf-correlate.c
|
||||||
|
+++ b/upatch/upatch-diff/elf-correlate.c
|
||||||
|
@@ -116,11 +116,13 @@ static void correlate_section(struct section *sec_orig, struct section *sec_patc
|
||||||
|
__correlate_section(sec_orig->rela, sec_patched->rela);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (sec_orig->secsym)
|
||||||
|
+ if (sec_orig->secsym && sec_patched->secsym) {
|
||||||
|
correlate_symbol(sec_orig->secsym, sec_patched->secsym);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (sec_orig->sym)
|
||||||
|
+ if (sec_orig->sym) {
|
||||||
|
correlate_symbol(sec_orig->sym, sec_patched->sym);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
void upatch_correlate_sections(struct upatch_elf *uelf_source, struct upatch_elf *uelf_patched)
|
||||||
|
@@ -397,4 +399,4 @@ void upatch_correlate_static_local_variables(struct upatch_elf *uelf_source, str
|
||||||
|
}
|
||||||
|
|
||||||
|
return check_static_variable_correlate(uelf_source, uelf_patched);
|
||||||
|
-}
|
||||||
|
\ No newline at end of file
|
||||||
|
+}
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
49
0012-daemon-fix-rust-1.60-compile-issue.patch
Normal file
49
0012-daemon-fix-rust-1.60-compile-issue.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
From d6ca7e72c9ab04bcebbd557e08f795dbbba1dc8a Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Fri, 22 Dec 2023 18:04:50 +0800
|
||||||
|
Subject: [PATCH 12/15] daemon: fix rust 1.60 compile issue
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
daemon/src/patch/manager/driver/upatch/mod.rs | 21 +++++++------------
|
||||||
|
1 file changed, 8 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemon/src/patch/manager/driver/upatch/mod.rs b/daemon/src/patch/manager/driver/upatch/mod.rs
|
||||||
|
index 4d06e84..191b327 100644
|
||||||
|
--- a/daemon/src/patch/manager/driver/upatch/mod.rs
|
||||||
|
+++ b/daemon/src/patch/manager/driver/upatch/mod.rs
|
||||||
|
@@ -1,7 +1,4 @@
|
||||||
|
-use std::{
|
||||||
|
- ffi::CStr,
|
||||||
|
- path::{Path, PathBuf},
|
||||||
|
-};
|
||||||
|
+use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
use anyhow::{anyhow, bail, ensure, Result};
|
||||||
|
|
||||||
|
@@ -130,15 +127,13 @@ impl UserPatchDriver {
|
||||||
|
msg_buf.capacity(),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
- if ret_val != 0 {
|
||||||
|
- match CStr::from_bytes_until_nul(&msg_buf) {
|
||||||
|
- Ok(err_msg) => bail!(format!("Upatch: {}", err_msg.to_string_lossy())),
|
||||||
|
- Err(_) => bail!(format!(
|
||||||
|
- "Upatch: {}",
|
||||||
|
- std::io::Error::from_raw_os_error(ret_val)
|
||||||
|
- )),
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+ ensure!(
|
||||||
|
+ ret_val == 0,
|
||||||
|
+ format!(
|
||||||
|
+ "Upatch: {}",
|
||||||
|
+ String::from_utf8_lossy(&msg_buf).trim_end_matches(|c| c == '\0')
|
||||||
|
+ )
|
||||||
|
+ );
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
106
0013-upatchd-create-config-dir-at-startup.patch
Normal file
106
0013-upatchd-create-config-dir-at-startup.patch
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
From 5feeef470d6088cc03e04e4a8f750b6f3ae816ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Wed, 27 Dec 2023 17:17:16 +0800
|
||||||
|
Subject: [PATCH 13/15] upatchd: create config dir at startup
|
||||||
|
|
||||||
|
1. rename arg '--config-file' to '--config-dir'
|
||||||
|
2. try to create config directory at startup
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
upatch/upatch-daemon/src/args/matcher.rs | 4 ++--
|
||||||
|
upatch/upatch-daemon/src/args/mod.rs | 8 ++++----
|
||||||
|
upatch/upatch-daemon/src/main.rs | 7 ++++++-
|
||||||
|
3 files changed, 12 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/upatch/upatch-daemon/src/args/matcher.rs b/upatch/upatch-daemon/src/args/matcher.rs
|
||||||
|
index 66cf316..0badaf6 100644
|
||||||
|
--- a/upatch/upatch-daemon/src/args/matcher.rs
|
||||||
|
+++ b/upatch/upatch-daemon/src/args/matcher.rs
|
||||||
|
@@ -2,8 +2,8 @@ use clap::{clap_app, crate_description, crate_name, crate_version, AppSettings,
|
||||||
|
|
||||||
|
const DEFAULT_PID_FILE: &str = "/var/run/upatchd.pid";
|
||||||
|
const DEFAULT_SOCKET_FILE: &str = "/var/run/upatchd.sock";
|
||||||
|
-const DEFAULT_CONFIG_FILE: &str = "/etc/syscare/upatchd.yaml";
|
||||||
|
const DEFAULT_WORK_DIR: &str = "/var/run/syscare";
|
||||||
|
+const DEFAULT_CONFIG_DIR: &str = "/etc/syscare";
|
||||||
|
const DEFAULT_LOG_DIR: &str = "/var/log/syscare";
|
||||||
|
const DEFAULT_LOG_LEVEL: &str = "info";
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@ impl ArgMatcher {
|
||||||
|
(@arg daemon: short("d") long("daemon") "Run as a daemon")
|
||||||
|
(@arg pid_file: long("pid-file") +takes_value value_name("PID_FILE") default_value(DEFAULT_PID_FILE) "Path for daemon pid file")
|
||||||
|
(@arg socket_file: long("socket-file") +takes_value value_name("SOCKET_FILE") default_value(DEFAULT_SOCKET_FILE) "Path for daemon unix socket")
|
||||||
|
- (@arg config_file: long("config-file") +takes_value value_name("CONFIG_FILE") default_value(DEFAULT_CONFIG_FILE) "Path for daemon config file")
|
||||||
|
+ (@arg config_file: long("config-dir") +takes_value value_name("CONFIG_DIR") default_value(DEFAULT_CONFIG_DIR) "Daemon config directory")
|
||||||
|
(@arg work_dir: long("work-dir") +takes_value value_name("WORK_DIR") default_value(DEFAULT_WORK_DIR) "Daemon working directory")
|
||||||
|
(@arg log_dir: long("log-dir") +takes_value value_name("LOG_DIR") default_value(DEFAULT_LOG_DIR) "Daemon logging directory")
|
||||||
|
(@arg log_level: short("l") long("log-level") +takes_value value_name("LOG_LEVEL") default_value(DEFAULT_LOG_LEVEL) "Set the logging level (\"trace\"|\"debug\"|\"info\"|\"warn\"|\"error\")")
|
||||||
|
diff --git a/upatch/upatch-daemon/src/args/mod.rs b/upatch/upatch-daemon/src/args/mod.rs
|
||||||
|
index e20d66b..318470e 100644
|
||||||
|
--- a/upatch/upatch-daemon/src/args/mod.rs
|
||||||
|
+++ b/upatch/upatch-daemon/src/args/mod.rs
|
||||||
|
@@ -23,8 +23,8 @@ pub struct Arguments {
|
||||||
|
/// Path for daemon unix socket
|
||||||
|
pub socket_file: PathBuf,
|
||||||
|
|
||||||
|
- /// Path for daemon configuration file
|
||||||
|
- pub config_file: PathBuf,
|
||||||
|
+ /// Daemon config directory
|
||||||
|
+ pub config_dir: PathBuf,
|
||||||
|
|
||||||
|
/// Daemon working directory
|
||||||
|
pub work_dir: PathBuf,
|
||||||
|
@@ -45,7 +45,7 @@ impl Parser<'_> for Arguments {
|
||||||
|
daemon: ArgParserImpl::is_present(matches, "daemon"),
|
||||||
|
pid_file: ArgParserImpl::parse_arg(matches, "pid_file")?,
|
||||||
|
socket_file: ArgParserImpl::parse_arg(matches, "socket_file")?,
|
||||||
|
- config_file: ArgParserImpl::parse_arg(matches, "config_file")?,
|
||||||
|
+ config_dir: ArgParserImpl::parse_arg(matches, "config_dir")?,
|
||||||
|
work_dir: ArgParserImpl::parse_arg(matches, "work_dir")?,
|
||||||
|
log_dir: ArgParserImpl::parse_arg(matches, "log_dir")?,
|
||||||
|
log_level: ArgParserImpl::parse_arg(matches, "log_level")?,
|
||||||
|
@@ -64,7 +64,7 @@ impl Arguments {
|
||||||
|
fn normalize_pathes(mut self) -> Result<Self> {
|
||||||
|
self.pid_file = fs::normalize(&self.pid_file)?;
|
||||||
|
self.socket_file = fs::normalize(&self.socket_file)?;
|
||||||
|
- self.config_file = fs::normalize(&self.config_file)?;
|
||||||
|
+ self.config_dir = fs::normalize(&self.config_dir)?;
|
||||||
|
self.work_dir = fs::normalize(self.work_dir)?;
|
||||||
|
self.log_dir = fs::normalize(&self.log_dir)?;
|
||||||
|
|
||||||
|
diff --git a/upatch/upatch-daemon/src/main.rs b/upatch/upatch-daemon/src/main.rs
|
||||||
|
index cda98b2..80c292f 100644
|
||||||
|
--- a/upatch/upatch-daemon/src/main.rs
|
||||||
|
+++ b/upatch/upatch-daemon/src/main.rs
|
||||||
|
@@ -28,6 +28,8 @@ use args::Arguments;
|
||||||
|
use logger::Logger;
|
||||||
|
use rpc::{Skeleton, SkeletonImpl};
|
||||||
|
|
||||||
|
+const CONFIG_FILE_NAME: &str = "upatchd.yaml";
|
||||||
|
+
|
||||||
|
const DAEMON_VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||||
|
const DAEMON_UMASK: u32 = 0o027;
|
||||||
|
const DAEMON_PARK_TIMEOUT: u64 = 100;
|
||||||
|
@@ -67,6 +69,8 @@ impl Daemon {
|
||||||
|
}
|
||||||
|
|
||||||
|
fn prepare_environment(&self) -> Result<()> {
|
||||||
|
+ self.prepare_directory(&self.args.config_dir)?;
|
||||||
|
+
|
||||||
|
self.prepare_directory(&self.args.work_dir)?;
|
||||||
|
self.prepare_directory(&self.args.log_dir)?;
|
||||||
|
Ok(())
|
||||||
|
@@ -99,7 +103,8 @@ impl Daemon {
|
||||||
|
fn initialize_skeleton(&self) -> Result<IoHandler> {
|
||||||
|
let mut io_handler = IoHandler::new();
|
||||||
|
|
||||||
|
- io_handler.extend_with(SkeletonImpl::new(&self.args.config_file)?.to_delegate());
|
||||||
|
+ let config_file = self.args.config_dir.join(CONFIG_FILE_NAME);
|
||||||
|
+ io_handler.extend_with(SkeletonImpl::new(config_file)?.to_delegate());
|
||||||
|
|
||||||
|
Ok(io_handler)
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
1382
0014-syscare-move-files-to-working-directory.patch
Normal file
1382
0014-syscare-move-files-to-working-directory.patch
Normal file
File diff suppressed because it is too large
Load Diff
363
0015-upatch-fix-memory-leak.patch
Normal file
363
0015-upatch-fix-memory-leak.patch
Normal file
@ -0,0 +1,363 @@
|
|||||||
|
From 4bac002ec33f3593ef03ff01494b524234c40484 Mon Sep 17 00:00:00 2001
|
||||||
|
From: renoseven <dev@renoseven.net>
|
||||||
|
Date: Tue, 26 Dec 2023 13:07:53 +0800
|
||||||
|
Subject: [PATCH 15/15] upatch: fix memory leak
|
||||||
|
|
||||||
|
Signed-off-by: renoseven <dev@renoseven.net>
|
||||||
|
---
|
||||||
|
upatch/upatch-manage/upatch-patch.c | 4 +-
|
||||||
|
upatch/upatch-tool/upatch-meta.c | 8 ++-
|
||||||
|
upatch/upatch-tool/upatch-resolve.c | 63 +++++++---------
|
||||||
|
upatch/upatch-tool/upatch-resolve.h | 3 +-
|
||||||
|
upatch/upatch-tool/upatch-tool-lib.c | 104 +++++++++++++++++++++------
|
||||||
|
5 files changed, 117 insertions(+), 65 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/upatch/upatch-manage/upatch-patch.c b/upatch/upatch-manage/upatch-patch.c
|
||||||
|
index 762641c..4763778 100644
|
||||||
|
--- a/upatch/upatch-manage/upatch-patch.c
|
||||||
|
+++ b/upatch/upatch-manage/upatch-patch.c
|
||||||
|
@@ -590,8 +590,8 @@ static int upatch_apply_patches(struct upatch_process *proc,
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
ret = -1;
|
||||||
|
- log_debug("can't found inode %lu in pid %d\n",
|
||||||
|
- uelf->relf->info.inode, proc->pid);
|
||||||
|
+ log_debug("Cannot find inode %lu in pid %d, file is not loaded\n",
|
||||||
|
+ uelf->relf->info.inode, proc->pid);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/upatch/upatch-tool/upatch-meta.c b/upatch/upatch-tool/upatch-meta.c
|
||||||
|
index c625115..2bd39b4 100644
|
||||||
|
--- a/upatch/upatch-tool/upatch-meta.c
|
||||||
|
+++ b/upatch/upatch-tool/upatch-meta.c
|
||||||
|
@@ -197,9 +197,11 @@ static int patch_deactive_in_cover(struct upatch_meta_patch *patch)
|
||||||
|
static int list_add_symbol(struct list_head *head, struct upatch_meta_symbol *sym)
|
||||||
|
{
|
||||||
|
struct upatch_meta_symbol *newsym = (struct upatch_meta_symbol *)malloc(sizeof(struct upatch_meta_symbol));
|
||||||
|
- if (newsym == NULL)
|
||||||
|
+ if (newsym == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
+ }
|
||||||
|
memset(newsym, 0, sizeof(struct upatch_meta_symbol));
|
||||||
|
+
|
||||||
|
strncpy(newsym->name, sym->name, sizeof(newsym->name));
|
||||||
|
newsym->offset = sym->offset;
|
||||||
|
INIT_LIST_HEAD(&newsym->self);
|
||||||
|
@@ -212,9 +214,11 @@ static int list_add_symbol(struct list_head *head, struct upatch_meta_symbol *sy
|
||||||
|
static int list_add_symbol_for_patch(struct upatch_meta_patch *patch, struct list_head *head, struct upatch_meta_symbol *sym)
|
||||||
|
{
|
||||||
|
struct upatch_meta_symbol *newsym = (struct upatch_meta_symbol *)malloc(sizeof(struct upatch_meta_symbol));
|
||||||
|
- if (newsym == NULL)
|
||||||
|
+ if (newsym == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
+ }
|
||||||
|
memset(newsym, 0, sizeof(struct upatch_meta_symbol));
|
||||||
|
+
|
||||||
|
strncpy(newsym->name, sym->name, sizeof(newsym->name));
|
||||||
|
newsym->offset = sym->offset;
|
||||||
|
INIT_LIST_HEAD(&newsym->self);
|
||||||
|
diff --git a/upatch/upatch-tool/upatch-resolve.c b/upatch/upatch-tool/upatch-resolve.c
|
||||||
|
index aeb655c..e9d75e0 100644
|
||||||
|
--- a/upatch/upatch-tool/upatch-resolve.c
|
||||||
|
+++ b/upatch/upatch-tool/upatch-resolve.c
|
||||||
|
@@ -42,79 +42,66 @@ out:
|
||||||
|
static int list_add_symbol(struct list_head *head, patch_symbols_t *sym)
|
||||||
|
{
|
||||||
|
patch_symbols_t *newsym = (patch_symbols_t *)malloc(sizeof(patch_symbols_t));
|
||||||
|
- if (newsym == NULL)
|
||||||
|
+ if (newsym == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
memset(newsym, 0, sizeof(patch_symbols_t));
|
||||||
|
strncpy(newsym->name, sym->name, sizeof(newsym->name));
|
||||||
|
newsym->offset = sym->offset;
|
||||||
|
INIT_LIST_HEAD(&newsym->self);
|
||||||
|
list_add(&newsym->self, head);
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-struct list_head* patch_symbols_resolve(const char *target_elf, const char *patch_file) {
|
||||||
|
- struct upatch_elf uelf;
|
||||||
|
- struct running_elf relf;
|
||||||
|
- GElf_Shdr *upatch_shdr = NULL;
|
||||||
|
- struct upatch_patch_func *upatch_funcs = NULL;
|
||||||
|
- GElf_Off min_addr; // binary base
|
||||||
|
- int num;
|
||||||
|
- struct list_head *head = malloc(sizeof(struct list_head));
|
||||||
|
+struct list_head* patch_symbols_resolve(struct upatch_elf *uelf, struct running_elf *relf) {
|
||||||
|
+ struct list_head *head = NULL;
|
||||||
|
|
||||||
|
- INIT_LIST_HEAD(head);
|
||||||
|
-
|
||||||
|
- int ret = upatch_init(&uelf, patch_file);
|
||||||
|
- if (ret < 0) {
|
||||||
|
- log_warn("upatch-resolve: upatch_init failed\n");
|
||||||
|
- goto out;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- ret = binary_init(&relf, target_elf);
|
||||||
|
- if (ret < 0) {
|
||||||
|
- log_warn("upatch-resolve: binary_init failed %d \n", ret);
|
||||||
|
- goto out;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (check_build_id(&uelf.info, &relf.info) == false) {
|
||||||
|
+ if (check_build_id(&uelf->info, &relf->info) == false) {
|
||||||
|
log_error("upatch-resolve: Build id mismatched!\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- uelf.relf = &relf;
|
||||||
|
- upatch_shdr = &uelf.info.shdrs[uelf.index.upatch_funcs];
|
||||||
|
- upatch_funcs = uelf.info.patch_buff + upatch_shdr->sh_offset;
|
||||||
|
- min_addr = calculate_load_address(uelf.relf, false);
|
||||||
|
+ GElf_Shdr *upatch_shdr = &uelf->info.shdrs[uelf->index.upatch_funcs];
|
||||||
|
+ GElf_Off min_addr = calculate_load_address(uelf->relf, false);
|
||||||
|
if (min_addr == (GElf_Off)-1) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- num = upatch_shdr->sh_size / sizeof(*upatch_funcs);
|
||||||
|
+ struct upatch_patch_func *upatch_funcs = uelf->info.patch_buff + upatch_shdr->sh_offset;
|
||||||
|
+ int num = upatch_shdr->sh_size / sizeof(*upatch_funcs);
|
||||||
|
|
||||||
|
log_debug("upatch-resolve: sh_size %lu, sizeof %lu \n", upatch_shdr->sh_size, sizeof(*upatch_funcs));
|
||||||
|
log_debug("upatch-resolve: elf base addr is 0x%lx, num is %d\n", min_addr, num);
|
||||||
|
|
||||||
|
+ head = malloc(sizeof(struct list_head));
|
||||||
|
+ INIT_LIST_HEAD(head);
|
||||||
|
+
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
|
- patch_symbols_t *sym = malloc(sizeof(patch_symbols_t));
|
||||||
|
- sprintf(sym->name, "sym_%d", i);
|
||||||
|
- sym->offset = upatch_funcs[i].old_addr - min_addr;;
|
||||||
|
- log_debug("+upatch-resolve: sym->offset addr is 0x%lx\n", sym->offset);
|
||||||
|
- list_add_symbol(head, sym);
|
||||||
|
+ patch_symbols_t sym;
|
||||||
|
+
|
||||||
|
+ sprintf(sym.name, "sym_%d", i);
|
||||||
|
+ sym.offset = upatch_funcs[i].old_addr - min_addr;
|
||||||
|
+ log_debug("upatch-resolve: sym->offset addr is 0x%lx\n", sym.offset);
|
||||||
|
+
|
||||||
|
+ list_add_symbol(head, &sym); // This would copy the symbol
|
||||||
|
}
|
||||||
|
|
||||||
|
return head;
|
||||||
|
+
|
||||||
|
out:
|
||||||
|
- free(head);
|
||||||
|
+ if (head != NULL) {
|
||||||
|
+ free(head);
|
||||||
|
+ }
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void patch_symbols_free(struct list_head *symbols) {
|
||||||
|
patch_symbols_t *sym, *next;
|
||||||
|
-
|
||||||
|
- if (!symbols)
|
||||||
|
- return;
|
||||||
|
list_for_each_entry_safe (sym, next, symbols, self) {
|
||||||
|
list_del(&sym->self);
|
||||||
|
free(sym);
|
||||||
|
}
|
||||||
|
+ free(symbols);
|
||||||
|
}
|
||||||
|
diff --git a/upatch/upatch-tool/upatch-resolve.h b/upatch/upatch-tool/upatch-resolve.h
|
||||||
|
index 7d0bb47..7c06345 100644
|
||||||
|
--- a/upatch/upatch-tool/upatch-resolve.h
|
||||||
|
+++ b/upatch/upatch-tool/upatch-resolve.h
|
||||||
|
@@ -2,8 +2,9 @@
|
||||||
|
#define __UPATCH_RESOLVE_H_
|
||||||
|
|
||||||
|
#include "list.h"
|
||||||
|
+#include "upatch-elf.h"
|
||||||
|
|
||||||
|
-struct list_head* patch_symbols_resolve(const char *target_elf, const char *patch_file);
|
||||||
|
+struct list_head* patch_symbols_resolve(struct upatch_elf *uelf, struct running_elf *relf);
|
||||||
|
void patch_symbols_free(struct list_head *symbols);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
diff --git a/upatch/upatch-tool/upatch-tool-lib.c b/upatch/upatch-tool/upatch-tool-lib.c
|
||||||
|
index 4e5bda1..3731abe 100644
|
||||||
|
--- a/upatch/upatch-tool/upatch-tool-lib.c
|
||||||
|
+++ b/upatch/upatch-tool/upatch-tool-lib.c
|
||||||
|
@@ -14,21 +14,43 @@
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
#include "list.h"
|
||||||
|
+#include "upatch-elf.h"
|
||||||
|
#include "upatch-meta.h"
|
||||||
|
#include "upatch-resolve.h"
|
||||||
|
#include "upatch-ioctl.h"
|
||||||
|
|
||||||
|
int upatch_check(const char *target_elf, const char *patch_file, char *err_msg, size_t max_len)
|
||||||
|
{
|
||||||
|
- struct list_head *patch_syms = patch_symbols_resolve(target_elf, patch_file);
|
||||||
|
+ int ret = 0;
|
||||||
|
+ struct list_head *patch_syms = NULL;
|
||||||
|
+ struct list_head *collision_list = NULL;
|
||||||
|
+
|
||||||
|
+ struct upatch_elf uelf;
|
||||||
|
+ ret = upatch_init(&uelf, patch_file);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ snprintf(err_msg, max_len, "Failed to read patch");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ struct running_elf relf;
|
||||||
|
+ ret = binary_init(&relf, target_elf);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ snprintf(err_msg, max_len, "Failed to read target elf");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ uelf.relf = &relf;
|
||||||
|
+
|
||||||
|
+ patch_syms = patch_symbols_resolve(&uelf, &relf);
|
||||||
|
if (patch_syms == NULL) {
|
||||||
|
snprintf(err_msg, max_len, "Patch format error");
|
||||||
|
- return ENOEXEC;
|
||||||
|
+ ret = ENOEXEC;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- struct list_head *collision_list = meta_get_symbol_collision(target_elf, patch_syms);
|
||||||
|
+ collision_list = meta_get_symbol_collision(target_elf, patch_syms);
|
||||||
|
if (collision_list == NULL) {
|
||||||
|
- return 0;
|
||||||
|
+ ret = 0;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
int offset = snprintf(err_msg, max_len, "Patch is conflicted with ");
|
||||||
|
@@ -39,50 +61,78 @@ int upatch_check(const char *target_elf, const char *patch_file, char *err_msg,
|
||||||
|
offset = snprintf(err_msg, max_len, "\"%s\" ", collision->uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
- patch_symbols_free(patch_syms);
|
||||||
|
- meta_put_symbol_collision(collision_list);
|
||||||
|
+out:
|
||||||
|
+ if (patch_syms != NULL) {
|
||||||
|
+ patch_symbols_free(patch_syms);
|
||||||
|
+ }
|
||||||
|
+ if (collision_list != NULL) {
|
||||||
|
+ meta_put_symbol_collision(collision_list);
|
||||||
|
+ }
|
||||||
|
+ binary_close(&relf);
|
||||||
|
+ upatch_close(&uelf);
|
||||||
|
|
||||||
|
- return EEXIST;
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int upatch_load(const char *uuid, const char *target, const char *patch, bool force)
|
||||||
|
{
|
||||||
|
+ int ret = 0;
|
||||||
|
+ struct list_head *patch_syms = NULL;
|
||||||
|
+ patch_entity_t *patch_entity = NULL;
|
||||||
|
+ struct list_head *collision_syms = NULL;
|
||||||
|
+
|
||||||
|
// Pointer check
|
||||||
|
if (uuid == NULL || target == NULL || patch == NULL) {
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
log_normal("Loading patch {%s} (\"%s\") for \"%s\"\n", uuid, patch, target);
|
||||||
|
|
||||||
|
+ struct upatch_elf uelf;
|
||||||
|
+ ret = upatch_init(&uelf, patch);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ log_warn("Failed to read patch\n");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ struct running_elf relf;
|
||||||
|
+ ret = binary_init(&relf, target);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ log_warn("Failed to read target elf\n");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ uelf.relf = &relf;
|
||||||
|
+
|
||||||
|
// Fails if patch is already exist
|
||||||
|
if (meta_get_patch_status(uuid) != UPATCH_PATCH_STATUS_NOT_APPLIED) {
|
||||||
|
log_warn("{%s}: Patch status is invalid\n", uuid);
|
||||||
|
- return EPERM;
|
||||||
|
+ ret = EPERM;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resolve patch symbols
|
||||||
|
- struct list_head *patch_syms = patch_symbols_resolve(target, patch);
|
||||||
|
+ patch_syms = patch_symbols_resolve(&uelf, &relf);
|
||||||
|
if (patch_syms == NULL) {
|
||||||
|
log_warn("{%s}: Patch format error\n", uuid);
|
||||||
|
- return ENOEXEC;
|
||||||
|
+ ret = ENOEXEC;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check patch symbol collision
|
||||||
|
if (!force) {
|
||||||
|
- struct list_head *collision_syms = meta_get_symbol_collision(target, patch_syms);
|
||||||
|
+ collision_syms = meta_get_symbol_collision(target, patch_syms);
|
||||||
|
if (collision_syms != NULL) {
|
||||||
|
log_warn("{%s}: Patch symbol conflicted\n", uuid);
|
||||||
|
- patch_symbols_free(patch_syms);
|
||||||
|
- meta_put_symbol_collision(collision_syms);
|
||||||
|
- return EEXIST;
|
||||||
|
+ ret = EEXIST;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alloc memory for patch
|
||||||
|
- patch_entity_t *patch_entity = calloc(1, sizeof(patch_entity_t));
|
||||||
|
+ patch_entity = calloc(1, sizeof(patch_entity_t));
|
||||||
|
if (patch_entity == NULL) {
|
||||||
|
log_warn("{%s}: Failed to alloc memory\n", uuid);
|
||||||
|
- patch_symbols_free(patch_syms);
|
||||||
|
- return ENOMEM;
|
||||||
|
+ ret = ENOMEM;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(patch_entity->target_path, target, strnlen(target, PATH_MAX));
|
||||||
|
@@ -91,17 +141,27 @@ int upatch_load(const char *uuid, const char *target, const char *patch, bool fo
|
||||||
|
log_normal("patch: %s, patch_path: %s\n", patch, patch_entity->patch_path);
|
||||||
|
patch_entity->symbols = patch_syms;
|
||||||
|
|
||||||
|
- int ret = meta_create_patch(uuid, patch_entity);
|
||||||
|
+ ret = meta_create_patch(uuid, patch_entity);
|
||||||
|
if (ret != 0) {
|
||||||
|
log_warn("{%s}: Failed to create patch entity\n", uuid);
|
||||||
|
- free(patch_entity);
|
||||||
|
- patch_symbols_free(patch_syms);
|
||||||
|
- return ret;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- free(patch_entity);
|
||||||
|
meta_set_patch_status(uuid, UPATCH_PATCH_STATUS_DEACTIVED);
|
||||||
|
|
||||||
|
+out:
|
||||||
|
+ if (collision_syms != NULL) {
|
||||||
|
+ meta_put_symbol_collision(collision_syms);
|
||||||
|
+ }
|
||||||
|
+ if (patch_syms != NULL) {
|
||||||
|
+ patch_symbols_free(patch_syms);
|
||||||
|
+ }
|
||||||
|
+ if (patch_entity != NULL) {
|
||||||
|
+ free(patch_entity);
|
||||||
|
+ }
|
||||||
|
+ binary_close(&relf);
|
||||||
|
+ upatch_close(&uelf);
|
||||||
|
+
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
28
syscare.spec
28
syscare.spec
@ -12,11 +12,28 @@
|
|||||||
############################################
|
############################################
|
||||||
Name: syscare
|
Name: syscare
|
||||||
Version: 1.2.0
|
Version: 1.2.0
|
||||||
Release: 6
|
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-builder-fix-enabling-multiple-kpatch-may-lead-soft-l.patch
|
||||||
|
Patch0002: 0002-upatch-fix-upatch-manage-detach-failure-issue.patch
|
||||||
|
Patch0003: 0003-upatch-remove-upatch-manage-log-file.patch
|
||||||
|
Patch0004: 0004-upatch-remove-redudant-log-output.patch
|
||||||
|
Patch0005: 0005-upatch-manage-close-dup-fd.patch
|
||||||
|
Patch0006: 0006-daemon-check-patch-before-patch-restoration.patch
|
||||||
|
Patch0007: 0007-upatch-elf-verification.patch
|
||||||
|
Patch0008: 0008-upatch-check-build-id.patch
|
||||||
|
Patch0009: 0009-README-add-example-for-kernel-module-patch-build.patch
|
||||||
|
Patch0010: 0010-daemon-fix-check-build-id-logic.patch
|
||||||
|
Patch0011: 0011-upatch-diff-fix-a-nullptr-issue.patch
|
||||||
|
Patch0012: 0012-daemon-fix-rust-1.60-compile-issue.patch
|
||||||
|
Patch0013: 0013-upatchd-create-config-dir-at-startup.patch
|
||||||
|
Patch0014: 0014-syscare-move-files-to-working-directory.patch
|
||||||
|
Patch0015: 0015-upatch-fix-memory-leak.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
|
||||||
BuildRequires: gcc gcc-c++
|
BuildRequires: gcc gcc-c++
|
||||||
@ -177,6 +194,15 @@ depmod > /dev/null 2>&1
|
|||||||
################ Change log ################
|
################ Change log ################
|
||||||
############################################
|
############################################
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Dec 26 2023 ningyu<ningyu9@huawei.com> - 1.2.0-10
|
||||||
|
- fix memory leak
|
||||||
|
* Fri Dec 22 2023 ningyu<ningyu9@huawei.com> - 1.2.0-9
|
||||||
|
- Add Suggests for syscare-build
|
||||||
|
- Remove log directory
|
||||||
|
* Tue Dec 12 2023 renoseven<dev@renoseven.net> - 1.2.0-8
|
||||||
|
- Builder: fix 'enabling multiple kpatch may lead soft-lockup' issue
|
||||||
|
* Wed Nov 29 2023 renoseven<dev@renoseven.net> - 1.2.0-7
|
||||||
|
- Fix aarch64 compile issue
|
||||||
* Tue Nov 28 2023 renoseven<dev@renoseven.net> - 1.2.0-6
|
* Tue Nov 28 2023 renoseven<dev@renoseven.net> - 1.2.0-6
|
||||||
- Enable debuginfo for rust code
|
- Enable debuginfo for rust code
|
||||||
- Sync arguments with old version
|
- Sync arguments with old version
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user