secDetector/Backport-fix-system-crash-caused-by-registration-exception.patch

86 lines
3.3 KiB
Diff
Raw Normal View History

2023-11-27 10:35:47 +08:00
From 4b28444ed29d730de3b2e145dbd43d9d508deb41 Mon Sep 17 00:00:00 2001
From: yieux <yangxy79315@sina.com>
Date: Thu, 23 Nov 2023 14:40:02 +0800
Subject: fix system crash caused by registration exception
---
.../core/analyze_unit/secDetector_analyze.c | 1 +
kerneldriver/core/secDetector_manager.c | 17 +++++++++++++----
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/kerneldriver/core/analyze_unit/secDetector_analyze.c b/kerneldriver/core/analyze_unit/secDetector_analyze.c
index 688a5e0..226e245 100644
--- a/kerneldriver/core/analyze_unit/secDetector_analyze.c
+++ b/kerneldriver/core/analyze_unit/secDetector_analyze.c
@@ -17,6 +17,7 @@ analyze_func_t analyze_units[NR_ANALYZE] = {
[ANALYZE_PRESET_SAVE_CHECK] = analyze_save_check,
};
+// 不使用analyze_status_data的时候data_type 为0因此free_analyze_status_data不处理对应的 ANALYZE_STATUS。
void free_analyze_status_data(analyze_status_t *analyze_status_data)
{
switch (analyze_status_data->data.data_type) {
diff --git a/kerneldriver/core/secDetector_manager.c b/kerneldriver/core/secDetector_manager.c
index 9304877..4c88386 100644
--- a/kerneldriver/core/secDetector_manager.c
+++ b/kerneldriver/core/secDetector_manager.c
@@ -35,12 +35,14 @@ void secDetector_module_unregister(struct secDetector_module *module)
mutex_lock(&g_hook_list_array_mutex);
ret_id = idr_remove(&g_module_idr, (unsigned long)module->id);
if (ret_id == NULL) {
+ pr_err("[secDetector] remove module id failed\n");
goto error;
}
for (i = 0, wf = module->workflow_array; i < module->workflow_array_len;
i++, wf++) {
if (wf == NULL) {
+ pr_err("[secDetector] invalid workflow\n");
goto error;
}
ret = delete_callback(wf);
@@ -48,15 +50,20 @@ void secDetector_module_unregister(struct secDetector_module *module)
pr_err("[secDetector] delete callback failed, return %d\n", ret);
goto error;
}
- // workflow在被卸载的时候需要释放analyze status等申请的内存,特别是使用默认的response list。
- free_analyze_status_data(&wf->analyze_status);
- if (wf->response_array_len == 0) {
+ if (wf->workflow_type == WORKFLOW_PRESET) {
+ // workflow在被卸载的时候需要释放analyze status等申请的内存,特别是使用默认的response list。
+ free_analyze_status_data(&wf->analyze_status);
+ if (wf->response_array_len == 0) {
kfree(wf->response_array);
+ }
}
}
error:
- list_del_rcu(&module->list);
+ //secDetector_module_unregister 的执行流可能来源于 失败的register因此module此时还未被list_add_rcu
+ if ((module->list.next != NULL) && (module->list.prev != NULL) &&
+ ((module->list.next != &module->list) || (module->list.prev != &module->list)))
+ list_del_rcu(&module->list);
synchronize_rcu();
mutex_unlock(&g_hook_list_array_mutex);
@@ -125,6 +132,7 @@ int secDetector_module_register(struct secDetector_module *module)
for (i = 0, wf = module->workflow_array; i < module->workflow_array_len;
i++, wf++) {
if (wf == NULL) {
+ pr_err("[secDetector] invalid workflow\n");
ret = -EINVAL;
goto error;
}
@@ -148,6 +156,7 @@ int secDetector_module_register(struct secDetector_module *module)
param->proc_ops, param->data);
if (!param->entry) {
pr_err("[secDetector] create proc failed\n");
+ ret = -EINVAL;
goto error;
}
}
--
2.33.0