加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
backport-Add-safe-wapper-for-some-memory-and-string-functions.patch 31.43 KB
一键复制 编辑 原始数据 按行查看 历史
jinlun 提交于 2024-04-16 10:12 . backport some patches
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088
From 91fb7cbfd3b2d02c68a54fb7c35efc9d274a1bc6 Mon Sep 17 00:00:00 2001
From: Huaxin Lu <luhuaxin1@huawei.com>
Date: Wed, 14 Feb 2024 14:52:29 +0800
Subject: [PATCH 18/26] Add safe wapper for some memory and string functions
1. Warp some memory and strings functions to make them more safe.
2. Add detection for memory leakage.
Signed-off-by: Huaxin Lu <luhuaxin1@huawei.com>
---
src/Makefile | 4 +
src/common/dim_baseline.c | 5 +-
src/common/dim_baseline.h | 2 +-
src/common/dim_measure_log.c | 17 +--
src/common/dim_measure_log.h | 4 +-
src/common/dim_safe_func.c | 18 +++
src/common/dim_safe_func.h | 135 ++++++++++++++++++
src/common/dim_symbol.c | 3 +-
src/common/dim_tpm.c | 9 +-
src/common/dim_utils.c | 28 +---
src/common/dim_utils.h | 2 -
src/core/dim_core_main.c | 6 +
src/core/dim_core_mem_pool.c | 2 +-
src/core/dim_core_mem_pool.h | 2 +-
src/core/dim_core_sig.c | 30 ++--
src/core/policy/dim_core_policy.c | 25 ++--
src/core/policy/dim_core_policy_complex.c | 11 +-
.../dim_core_static_baseline.c | 6 +-
.../dim_core_static_baseline_complex.c | 2 +-
src/core/tasks/dim_core_measure_kernel.c | 2 +-
.../dim_core_measure_process.c | 18 ++-
.../dim_core_measure_process_elf.c | 22 +--
.../dim_core_measure_process/dim_vm_hash.c | 7 +-
src/measure/dim_measure_baseline.c | 10 +-
src/monitor/dim_monitor_main.c | 4 +
25 files changed, 268 insertions(+), 106 deletions(-)
create mode 100644 src/common/dim_safe_func.c
create mode 100644 src/common/dim_safe_func.h
diff --git a/src/Makefile b/src/Makefile
index 8f4dce8..6782fd1 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -34,6 +34,7 @@ dim_core-objs += common/dim_hash.o
dim_core-objs += common/dim_measure_log.o
dim_core-objs += common/dim_tpm.o
dim_core-objs += common/dim_symbol.o
+dim_core-objs += common/dim_safe_func.o
dim_core-objs += measure/dim_measure.o
dim_core-objs += measure/dim_measure_baseline.o
dim_core-objs += measure/dim_measure_task.o
@@ -55,6 +56,7 @@ dim_monitor-objs += common/dim_measure_log.o
dim_monitor-objs += common/dim_baseline.o
dim_monitor-objs += common/dim_tpm.o
dim_monitor-objs += common/dim_symbol.o
+dim_monitor-objs += common/dim_safe_func.o
dim_monitor-objs += measure/dim_measure.o
dim_monitor-objs += measure/dim_measure_baseline.o
dim_monitor-objs += measure/dim_measure_task.o
@@ -72,6 +74,8 @@ ccflags-y += -I$(src)/common
ccflags-y += -I$(src)/measure
ccflags-y += -Wall -Werror -D_FORTIFY_SOURCE=2 -O2 -fstack-protector-strong
+# For check memory leakage
+# ccflags-y += -DDIM_DEBUG_MEMORY_LEAK
KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
diff --git a/src/common/dim_baseline.c b/src/common/dim_baseline.c
index ec53b1c..e79458d 100644
--- a/src/common/dim_baseline.c
+++ b/src/common/dim_baseline.c
@@ -5,6 +5,7 @@
#include "dim_rb.h"
#include "dim_baseline.h"
#include "dim_utils.h"
+#include "dim_safe_func.h"
static int dim_baseline_compare(struct dim_baseline *x,
struct dim_baseline *y)
@@ -14,7 +15,7 @@ static int dim_baseline_compare(struct dim_baseline *x,
if (x->type != y->type)
return x->type > y->type ? 1 : -1;
- ret = strcmp(x->name, y->name);
+ ret = dim_strcmp(x->name, y->name);
if (ret != 0)
return ret;
@@ -150,7 +151,7 @@ int dim_baseline_init_tree(malloc_func malloc, free_func free,
rwlock_init(&root->lock);
root->rb_root = RB_ROOT;
/* use kmalloc by default */
- root->malloc = malloc == NULL ? dim_kmalloc_gfp : malloc;
+ root->malloc = malloc == NULL ? dim_kzalloc_gfp : malloc;
root->free = free == NULL ? dim_kfree : free;
return 0;
}
diff --git a/src/common/dim_baseline.h b/src/common/dim_baseline.h
index 6e9d943..345b348 100644
--- a/src/common/dim_baseline.h
+++ b/src/common/dim_baseline.h
@@ -9,7 +9,7 @@
#include "dim_hash.h"
typedef void *(*malloc_func)(size_t);
-typedef void (*free_func)(void*);
+typedef void (*free_func)(const void*);
enum dim_baseline_type {
DIM_BASELINE_USER, /* baseline of user process */
diff --git a/src/common/dim_measure_log.c b/src/common/dim_measure_log.c
index b4185d2..b84e635 100644
--- a/src/common/dim_measure_log.c
+++ b/src/common/dim_measure_log.c
@@ -6,6 +6,7 @@
#include "dim_rb.h"
#include "dim_tpm.h"
+#include "dim_safe_func.h"
#include "dim_measure_log.h"
/*
@@ -102,7 +103,7 @@ static int measure_info_insert(struct dim_measure_name *name,
static void measure_log_destroy_info(struct dim_measure_log *info)
{
- kfree(info);
+ dim_kfree(info);
}
static void measure_log_destroy_name(struct dim_measure_name *name)
@@ -114,8 +115,8 @@ static void measure_log_destroy_name(struct dim_measure_name *name)
list_for_each_entry_safe(pos, n, &name->log_root, node)
measure_log_destroy_info(pos);
/* free self */
- kfree(name->name);
- kfree(name);
+ dim_kfree(name->name);
+ dim_kfree(name);
}
static int measure_log_create_name(const char *name_str,
@@ -123,13 +124,13 @@ static int measure_log_create_name(const char *name_str,
{
struct dim_measure_name *new = NULL;
- new = kzalloc(sizeof(struct dim_measure_name), GFP_KERNEL);
+ new = dim_kzalloc_gfp(sizeof(struct dim_measure_name));
if (new == NULL)
return -ENOMEM;
- new->name = kstrdup(name_str, GFP_KERNEL);
+ new->name = dim_kstrdup_gfp(name_str);
if (new->name == NULL) {
- kfree(new);
+ dim_kfree(new);
return -ENOMEM;
}
@@ -145,7 +146,7 @@ static int measure_log_create_info(char pcr, struct dim_digest *digest,
int ret = 0;
struct dim_measure_log *new = NULL;
- new = kzalloc(sizeof(struct dim_measure_log), GFP_KERNEL);
+ new = dim_kzalloc_gfp(sizeof(struct dim_measure_log));
if (new == NULL)
return -ENOMEM;
@@ -153,7 +154,7 @@ static int measure_log_create_info(char pcr, struct dim_digest *digest,
new->type = flag;
ret = dim_digest_copy(&new->digest, digest);
if (ret < 0) {
- kfree(new);
+ dim_kfree(new);
return ret;
}
diff --git a/src/common/dim_measure_log.h b/src/common/dim_measure_log.h
index 28f8a00..6ea2361 100644
--- a/src/common/dim_measure_log.h
+++ b/src/common/dim_measure_log.h
@@ -7,7 +7,9 @@
#include <linux/list.h>
#include <linux/rbtree.h>
+
#include "dim_hash.h"
+#include "dim_safe_func.h"
#define DIM_NG "dim-ng"
#define LOG_MAX_LENGTH_PCR 3
@@ -61,7 +63,7 @@ struct dim_measure_log {
static inline int dim_measure_name_compare(struct dim_measure_name *x,
struct dim_measure_name *y)
{
- return strcmp(x->name, y->name);
+ return dim_strcmp(x->name, y->name);
}
static inline const char *dim_measure_log_type_to_name(int type)
diff --git a/src/common/dim_safe_func.c b/src/common/dim_safe_func.c
new file mode 100644
index 0000000..f13168c
--- /dev/null
+++ b/src/common/dim_safe_func.c
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
+ */
+
+#include "dim_safe_func.h"
+
+#ifdef DIM_DEBUG_MEMORY_LEAK
+atomic_t dim_alloc_num = ATOMIC_INIT(0);;
+
+void dim_check_memory_leak(void)
+{
+ unsigned int n = atomic_read(&dim_alloc_num);
+ if (n != 0)
+ dim_warn("warning: detect %u memory leakage\n", n);
+ else
+ dim_info("not detect memory leakage\n");
+}
+#endif
\ No newline at end of file
diff --git a/src/common/dim_safe_func.h b/src/common/dim_safe_func.h
new file mode 100644
index 0000000..3e97f4e
--- /dev/null
+++ b/src/common/dim_safe_func.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
+ */
+
+#ifndef __DIM_SAFE_FUNC_H
+#define __DIM_SAFE_FUNC_H
+
+#include <linux/atomic.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/string.h>
+
+#include "dim_utils.h"
+
+#ifdef DIM_DEBUG_MEMORY_LEAK
+extern atomic_t dim_alloc_num;
+
+static inline void dim_alloc_debug_inc(void)
+{
+ atomic_inc(&dim_alloc_num);
+}
+
+static inline void dim_alloc_debug_dec(void)
+{
+ atomic_dec(&dim_alloc_num);
+}
+
+static inline void dim_print_alloc_num(const char *s)
+{
+ dim_info("%s: dim_alloc_num=%d\n", s, atomic_read(&dim_alloc_num));
+}
+
+void dim_check_memory_leak(void);
+#endif
+
+static inline void *dim_kzalloc_gfp(size_t size)
+{
+#ifdef DIM_DEBUG_MEMORY_LEAK
+ void *data = kzalloc(size, GFP_KERNEL);
+ if (data != NULL)
+ dim_alloc_debug_inc();
+ return data;
+#else
+ return kzalloc(size, GFP_KERNEL);
+#endif
+}
+
+static inline void *dim_kcalloc_gfp(size_t n, size_t size)
+{
+#ifdef DIM_DEBUG_MEMORY_LEAK
+ void *data = kcalloc(n, size, GFP_KERNEL);
+ if (data != NULL)
+ dim_alloc_debug_inc();
+ return data;
+#else
+ return kcalloc(n, size, GFP_KERNEL);
+#endif
+}
+
+static inline void *dim_krealloc_atom(const void *p, size_t new_size)
+{
+ return krealloc(p, new_size, GFP_ATOMIC);
+}
+
+static inline void *dim_kmemdup_gfp(const void *src, size_t len)
+{
+#ifdef DIM_DEBUG_MEMORY_LEAK
+ void *data = kmemdup(src, len, GFP_KERNEL);
+ if (data != NULL)
+ dim_alloc_debug_inc();
+ return data;
+#else
+ return kmemdup(src, len, GFP_KERNEL);
+#endif
+}
+
+static inline void dim_kfree(const void *objp)
+{
+#ifdef DIM_DEBUG_MEMORY_LEAK
+ if (objp != NULL)
+ dim_alloc_debug_dec();
+#endif
+ kfree(objp);
+}
+
+static inline void *dim_vzalloc(size_t size)
+{
+#ifdef DIM_DEBUG_MEMORY_LEAK
+ void *data = vzalloc(size);
+ if (data != NULL)
+ dim_alloc_debug_inc();
+ return data;
+#else
+ return vzalloc(size);
+#endif
+}
+
+static inline void dim_vfree(void *data)
+{
+#ifdef DIM_DEBUG_MEMORY_LEAK
+ if (data != NULL)
+ dim_alloc_debug_dec();
+#endif
+ vfree(data);
+}
+
+static inline char *dim_kstrdup_gfp(const char *s)
+{
+#ifdef DIM_DEBUG_MEMORY_LEAK
+ void *data = kstrdup(s, GFP_KERNEL);
+ if (data != NULL)
+ dim_alloc_debug_inc();
+ return data;
+#else
+ return kstrdup(s, GFP_KERNEL);
+#endif
+}
+
+static inline int dim_strcmp(const char *cs, const char *ct)
+{
+ if (cs == NULL || ct == NULL)
+ return -1;
+
+ return strcmp(cs, ct);
+}
+
+static inline int dim_strncmp(const char *cs, const char *ct, size_t count)
+{
+ if (cs == NULL || ct == NULL)
+ return -1;
+
+ return strncmp(cs, ct, count);
+}
+
+#endif
\ No newline at end of file
diff --git a/src/common/dim_symbol.c b/src/common/dim_symbol.c
index 48f6491..63824e6 100644
--- a/src/common/dim_symbol.c
+++ b/src/common/dim_symbol.c
@@ -4,6 +4,7 @@
#include <linux/kallsyms.h>
+#include "dim_safe_func.h"
#include "dim_symbol.h"
static int find_kernel_symbol(unsigned long addr,
@@ -34,7 +35,7 @@ DIM_SYMBOL_LOOKUP_FUNC dim_get_symbol_lookup_func(void)
if (ret < 0 || offset > size)
break;
- if (strcmp(symbol_name, DIM_KALLSYMS_LOOKUP_NAME) == 0)
+ if (dim_strcmp(symbol_name, DIM_KALLSYMS_LOOKUP_NAME) == 0)
return (DIM_SYMBOL_LOOKUP_FUNC)(kaddr - offset);
if (kaddr == next) {
diff --git a/src/common/dim_tpm.c b/src/common/dim_tpm.c
index 5d983e8..6d3c255 100644
--- a/src/common/dim_tpm.c
+++ b/src/common/dim_tpm.c
@@ -4,6 +4,7 @@
#include <linux/crypto.h>
+#include "dim_safe_func.h"
#include "dim_tpm.h"
int dim_tpm_init(struct dim_tpm *tpm, int algo)
@@ -15,8 +16,8 @@ int dim_tpm_init(struct dim_tpm *tpm, int algo)
if (tpm->chip == NULL)
return -ENODEV;
- tpm->digests = kcalloc(tpm->chip->nr_allocated_banks,
- sizeof(struct tpm_digest), GFP_KERNEL);
+ tpm->digests = dim_kcalloc_gfp(tpm->chip->nr_allocated_banks,
+ sizeof(struct tpm_digest));
if (tpm->digests == NULL) {
ret = -ENOMEM;
goto err;
@@ -40,7 +41,7 @@ int dim_tpm_init(struct dim_tpm *tpm, int algo)
err:
put_device(&tpm->chip->dev);
if (tpm->digests != NULL) {
- kfree(tpm->digests);
+ dim_kfree(tpm->digests);
tpm->digests = NULL;
}
@@ -72,5 +73,5 @@ void dim_tpm_destroy(struct dim_tpm *tpm)
return;
put_device(&tpm->chip->dev);
- kfree(tpm->digests);
+ dim_kfree(tpm->digests);
}
\ No newline at end of file
diff --git a/src/common/dim_utils.c b/src/common/dim_utils.c
index 4c99879..598e824 100644
--- a/src/common/dim_utils.c
+++ b/src/common/dim_utils.c
@@ -5,22 +5,10 @@
#include <linux/fs.h>
#include <linux/err.h>
#include <linux/namei.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
+#include "dim_safe_func.h"
#include "dim_utils.h"
-void *dim_kmalloc_gfp(size_t size)
-{
- return kmalloc(size, GFP_KERNEL);
-}
-
-void dim_kfree(void *data)
-{
- if (data != NULL)
- kfree(data);
-}
-
int dim_get_absolute_path(const char *path, const char **result)
{
int ret = 0;
@@ -35,7 +23,7 @@ int dim_get_absolute_path(const char *path, const char **result)
if (ret < 0)
return ret;
- buf = dim_kmalloc_gfp(PATH_MAX);
+ buf = dim_kzalloc_gfp(PATH_MAX);
if (buf == NULL) {
ret = -ENOMEM;
goto out;
@@ -47,16 +35,14 @@ int dim_get_absolute_path(const char *path, const char **result)
goto out;
}
- *result = kstrdup(apath, GFP_KERNEL);
+ *result = dim_kstrdup_gfp(apath);
if (*result == NULL) {
ret = -ENOMEM;
goto out;
}
out:
path_put(&p);
- if (buf != NULL)
- dim_kfree(buf);
-
+ dim_kfree(buf);
return ret;
}
@@ -72,7 +58,7 @@ bool dim_string_end_with(const char *str, const char *ext)
if (name_len < ext_len)
return false;
- return strcmp(str + name_len - ext_len, ext) == 0;
+ return dim_strcmp(str + name_len - ext_len, ext) == 0;
}
int dim_parse_line_buf(char *buf, loff_t len, int (*line_parser)(char *, int, void *), void *data)
@@ -97,7 +83,7 @@ int dim_parse_line_buf(char *buf, loff_t len, int (*line_parser)(char *, int, vo
line = &buf[i + 1];
} else {
line_len = buf + i - line + 1;
- line_buf = kzalloc(line_len + 1, GFP_KERNEL);
+ line_buf = dim_kzalloc_gfp(line_len + 1);
if (line_buf == NULL)
return -ENOMEM;
@@ -118,7 +104,7 @@ int dim_parse_line_buf(char *buf, loff_t len, int (*line_parser)(char *, int, vo
}
out:
if (line_buf != NULL)
- kfree(line_buf);
+ dim_kfree(line_buf);
return ret;
}
diff --git a/src/common/dim_utils.h b/src/common/dim_utils.h
index 5a9f132..8c7d855 100644
--- a/src/common/dim_utils.h
+++ b/src/common/dim_utils.h
@@ -17,8 +17,6 @@
#define dim_info(fmt, ...) pr_info(dim_fmt(fmt), THIS_MODULE->name, ##__VA_ARGS__)
#define dim_devel(fmt, ...)
-void *dim_kmalloc_gfp(size_t size);
-void dim_kfree(void *data);
int dim_get_absolute_path(const char *path, const char **result);
bool dim_string_end_with(const char *str, const char *ext);
int dim_parse_line_buf(char *buf, loff_t len, int (*line_parser)(char *, int, void *), void *data);
diff --git a/src/core/dim_core_main.c b/src/core/dim_core_main.c
index ae34e81..c62fa09 100644
--- a/src/core/dim_core_main.c
+++ b/src/core/dim_core_main.c
@@ -4,6 +4,8 @@
#include <linux/module.h>
+#include "dim_safe_func.h"
+
#include "dim_core_policy.h"
#include "dim_core_symbol.h"
#include "dim_core_fs.h"
@@ -99,6 +101,10 @@ static void __exit dim_core_exit(void)
if (signature)
dim_core_sig_destroy();
+
+#ifdef DIM_DEBUG_MEMORY_LEAK
+ dim_check_memory_leak();
+#endif
}
module_init(dim_core_init);
diff --git a/src/core/dim_core_mem_pool.c b/src/core/dim_core_mem_pool.c
index 160f819..974033f 100644
--- a/src/core/dim_core_mem_pool.c
+++ b/src/core/dim_core_mem_pool.c
@@ -112,7 +112,7 @@ out:
return data->data;
}
-void dim_mem_pool_free(void *data)
+void dim_mem_pool_free(const void *data)
{
struct dim_pool_mem *mem = NULL;
diff --git a/src/core/dim_core_mem_pool.h b/src/core/dim_core_mem_pool.h
index c566dc8..5c4cdea 100644
--- a/src/core/dim_core_mem_pool.h
+++ b/src/core/dim_core_mem_pool.h
@@ -25,7 +25,7 @@ typedef void (*pool_chunk_visitor)(struct gen_pool *,
int dim_mem_pool_init(void);
void dim_mem_pool_destroy(void);
void *dim_mem_pool_alloc(size_t size);
-void dim_mem_pool_free(void *data);
+void dim_mem_pool_free(const void *data);
void dim_mem_pool_walk_chunk(pool_chunk_visitor f, void *data);
#endif
diff --git a/src/core/dim_core_sig.c b/src/core/dim_core_sig.c
index 70a3469..f142050 100644
--- a/src/core/dim_core_sig.c
+++ b/src/core/dim_core_sig.c
@@ -13,6 +13,7 @@
#include "dim_hash.h"
#include "dim_utils.h"
+#include "dim_safe_func.h"
#include "dim_core_sig.h"
@@ -26,7 +27,7 @@ static char *add_suffix(const char *str, const char *suffix)
char *buf = NULL;
len = strlen(str) + strlen(suffix) + 1;
- buf = dim_kmalloc_gfp(len);
+ buf = dim_kzalloc_gfp(len);
if (buf == NULL)
return NULL;
@@ -39,10 +40,16 @@ static int read_file_root(struct path *root, const char *name, void **buf)
int ret = 0;
struct file *file = NULL;
- if (root == NULL)
- return kernel_read_file_from_path(name, 0, buf,
+ if (root == NULL) {
+ ret = kernel_read_file_from_path(name, 0, buf,
DIM_CORE_MAX_FILE_SIZE,
NULL, READING_UNKNOWN);
+#ifdef DIM_DEBUG_MEMORY_LEAK
+ if (*buf != NULL)
+ dim_alloc_debug_inc();
+#endif
+ return ret;
+ }
file = file_open_root(root, name, O_RDONLY, 0);
if (IS_ERR(file))
@@ -50,6 +57,10 @@ static int read_file_root(struct path *root, const char *name, void **buf)
ret = kernel_read_file(file, 0, buf, DIM_CORE_MAX_FILE_SIZE,
NULL, READING_UNKNOWN);
+#ifdef DIM_DEBUG_MEMORY_LEAK
+ if (*buf != NULL)
+ dim_alloc_debug_inc();
+#endif
(void)filp_close(file, NULL);
return ret;
}
@@ -114,12 +125,10 @@ int dim_read_verify_file(struct path *root, const char *name, void **buf)
sig_size = ret;
ret = dim_core_sig_verify(file_buf, file_size, sig_buf, sig_size);
out:
- if (sig_name != NULL)
- kfree(sig_name);
- if (sig_buf != NULL)
- vfree(sig_buf);
- if (file_buf != NULL && ret < 0)
- vfree(file_buf);
+ dim_kfree(sig_name);
+ dim_vfree(sig_buf);
+ if (ret < 0)
+ dim_vfree(file_buf);
if (ret == 0) {
*buf = file_buf;
ret = file_size;
@@ -172,8 +181,7 @@ int dim_core_sig_init(void)
dim_info("load DIM cert: %s\n", dim_core_key->description);
ret = 0;
err:
- if (data != NULL)
- vfree(data);
+ dim_vfree(data);
if (ret < 0)
key_put(dim_core_keyring);
return ret;
diff --git a/src/core/policy/dim_core_policy.c b/src/core/policy/dim_core_policy.c
index 4d7bcc1..f10a256 100644
--- a/src/core/policy/dim_core_policy.c
+++ b/src/core/policy/dim_core_policy.c
@@ -11,8 +11,9 @@
#include <linux/namei.h>
#include <linux/utsname.h>
-#include "dim_utils.h"
#include "dim_rb.h"
+#include "dim_utils.h"
+#include "dim_safe_func.h"
#include "dim_core_sig.h"
#include "dim_core_policy.h"
@@ -26,13 +27,9 @@ static int dim_policy_compare(struct dim_policy *x, struct dim_policy *y)
switch (x->obj) {
case DIM_POLICY_OBJ_BPRM_TEXT:
- if (x->path == NULL || y->path == NULL)
- return -1;
- return strcmp(x->path, y->path);
+ return dim_strcmp(x->path, y->path);
case DIM_POLICY_OBJ_MODULE_TEXT:
- if (x->name == NULL || y->name == NULL)
- return -1;
- return strcmp(x->name, y->name);
+ return dim_strcmp(x->name, y->name);
case DIM_POLICY_OBJ_KERNEL_TEXT:
return 0;
default:
@@ -60,8 +57,8 @@ void policy_destroy(struct dim_policy *policy)
if (policy == NULL)
return;
- dim_kfree((char *)policy->name);
- dim_kfree((char *)policy->path);
+ dim_kfree(policy->name);
+ dim_kfree(policy->path);
dim_kfree(policy);
}
@@ -100,15 +97,15 @@ static int policy_check_add_bprm_text(struct dim_policy *policy)
return 0;
}
- if (strcmp(apath, policy->path) == 0) {
+ if (dim_strcmp(apath, policy->path) == 0) {
/* the two paths are same, no need to add another policy */
- dim_kfree((char *)apath);
+ dim_kfree(apath);
return 0;
}
- p = kmemdup(policy, sizeof(struct dim_policy), GFP_KERNEL);
+ p = dim_kmemdup_gfp(policy, sizeof(struct dim_policy));
if (p == NULL) {
- dim_kfree((char *)apath);
+ dim_kfree(apath);
return -ENOMEM;
}
@@ -191,7 +188,7 @@ int dim_core_policy_load(void)
dim_core_policy_destroy();
}
- vfree(buf);
+ dim_vfree(buf);
return ret;
}
diff --git a/src/core/policy/dim_core_policy_complex.c b/src/core/policy/dim_core_policy_complex.c
index b29483d..18a9e58 100644
--- a/src/core/policy/dim_core_policy_complex.c
+++ b/src/core/policy/dim_core_policy_complex.c
@@ -4,7 +4,9 @@
#include <linux/slab.h>
+#include "dim_rb.h"
#include "dim_utils.h"
+#include "dim_safe_func.h"
#include "dim_core_policy.h"
@@ -41,7 +43,7 @@ static const char *dim_policy_action_str[DIM_POLICY_KEY_LAST] = {
static const char *policy_get_string_value(const char *s)
{
- return kstrdup(s, GFP_KERNEL);
+ return dim_kstrdup_gfp(s);
}
static int policy_get_action(const char *s)
@@ -121,7 +123,7 @@ static int parse_line(char *line_str, struct dim_policy *policy)
char *p = NULL;
if ((p = strsep(&line_str, " ")) == NULL ||
- strcmp(p, DIM_POLICY_MEASURE) != 0) {
+ dim_strcmp(p, DIM_POLICY_MEASURE) != 0) {
dim_err("invalid policy prefix, must start with %s\n",
DIM_POLICY_MEASURE);
return -EINVAL;
@@ -156,14 +158,13 @@ static int policy_parse_line(char* line, int line_no, void *data)
return -EINVAL;
}
- policy = dim_kmalloc_gfp(sizeof(struct dim_policy));
+ policy = dim_kzalloc_gfp(sizeof(struct dim_policy));
if (policy == NULL)
return -ENOMEM;
- memset(policy, 0, sizeof(struct dim_policy));
-
ret = parse_line(line, policy);
if (ret < 0) {
+ policy_destroy(policy);
dim_err("fail to parse policy at line %d: %d\n", line_no, ret);
return ret;
}
diff --git a/src/core/static_baseline/dim_core_static_baseline.c b/src/core/static_baseline/dim_core_static_baseline.c
index 49810f3..e33c67c 100644
--- a/src/core/static_baseline/dim_core_static_baseline.c
+++ b/src/core/static_baseline/dim_core_static_baseline.c
@@ -28,12 +28,12 @@ static bool baseline_match_policy(const char *name, int type)
return dim_core_policy_match(DIM_POLICY_OBJ_BPRM_TEXT,
DIM_POLICY_KEY_PATH, name);
- if (strcmp(name, kr) == 0)
+ if (dim_strcmp(name, kr) == 0)
return dim_core_policy_match(DIM_POLICY_OBJ_KERNEL_TEXT,
DIM_POLICY_KEY_NAME, kr);
if (name_len <= kr_len + 2 || /* <kernel release>/<mod_name> */
- strncmp(kr, name, kr_len) != 0 ||
+ dim_strncmp(kr, name, kr_len) != 0 ||
*(name + kr_len) != '/')
return false;
@@ -82,7 +82,7 @@ static_baseline_load(struct dir_context *__ctx,
dim_err("failed to parse baseline file %s: %d\n", name, ret);
out:
if (buf != NULL)
- vfree(buf);
+ dim_vfree(buf);
#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0)
return 0; /* ignore fail */
diff --git a/src/core/static_baseline/dim_core_static_baseline_complex.c b/src/core/static_baseline/dim_core_static_baseline_complex.c
index 685118f..8ff7c86 100644
--- a/src/core/static_baseline/dim_core_static_baseline_complex.c
+++ b/src/core/static_baseline/dim_core_static_baseline_complex.c
@@ -37,7 +37,7 @@ static int parse_line(char* line, int line_no, void *data)
}
if ((p = strsep(&line_str, " ")) == NULL ||
- strcmp(p, DIM_STATIC_BASELINE_PREFIX) != 0) {
+ dim_strcmp(p, DIM_STATIC_BASELINE_PREFIX) != 0) {
dim_warn("invalid baseline prefix at line %d\n", line_no);
return 0;
}
diff --git a/src/core/tasks/dim_core_measure_kernel.c b/src/core/tasks/dim_core_measure_kernel.c
index e13e177..d49095b 100644
--- a/src/core/tasks/dim_core_measure_kernel.c
+++ b/src/core/tasks/dim_core_measure_kernel.c
@@ -131,7 +131,7 @@ static int calc_kernel_digest(struct dim_hash *hash, struct dim_digest *digest)
if (ret < 0)
dim_err("failed to calculate kernel digest: %d\n", ret);
- vfree(jcode_sort);
+ dim_vfree(jcode_sort);
return ret;
}
diff --git a/src/core/tasks/dim_core_measure_process/dim_core_measure_process.c b/src/core/tasks/dim_core_measure_process/dim_core_measure_process.c
index 513f5a0..8522085 100644
--- a/src/core/tasks/dim_core_measure_process/dim_core_measure_process.c
+++ b/src/core/tasks/dim_core_measure_process/dim_core_measure_process.c
@@ -60,9 +60,8 @@ static int store_task_tree(struct task_struct *p, void *data)
/* realloc to size * 2 */
new_size = ctx->size << 1;
- tmp = krealloc(ctx->buf,
- new_size * sizeof(struct task_struct *),
- GFP_ATOMIC);
+ tmp = dim_krealloc_atom(ctx->buf,
+ new_size * sizeof(struct task_struct *));
if (tmp == NULL)
return -ENOMEM;
@@ -79,7 +78,7 @@ static int kill_task_tree(struct task_struct *tsk)
const int def_size = 32;
struct task_kill_ctx ctx = { .size = def_size };
- ctx.buf = dim_kmalloc_gfp(def_size * sizeof(struct task_struct *));
+ ctx.buf = dim_kzalloc_gfp(def_size * sizeof(struct task_struct *));
if (ctx.buf == NULL)
return -ENOMEM;
@@ -91,7 +90,7 @@ static int kill_task_tree(struct task_struct *tsk)
}
}
- kfree(ctx.buf);
+ dim_kfree(ctx.buf);
send_sig(SIGKILL, tsk, 1);
return 0;
}
@@ -166,7 +165,6 @@ static void measure_task_module(struct vm_area_struct *vma,
ret = measure_process_text(vma, ctx);
if (ret < 0)
dim_err("failed to measure module file text: %d", ret);
-
}
static int measure_task(struct task_struct *task, struct task_measure_ctx *ctx)
@@ -238,7 +236,7 @@ static int store_task_pids(pid_t **pid_buf, unsigned int *pid_cnt)
unsigned int max_cnt = (PID_MAX_DEFAULT << 1);
/* maximum processing of PID_MAX_DEFAULT * 2 pids */
- buf = vmalloc(max_cnt);
+ buf = dim_vzalloc(max_cnt);
if (buf == NULL) {
dim_err("failed to allocate memory for pid buffer\n");
return -ENOMEM;
@@ -294,7 +292,7 @@ static int walk_measure_tasks(struct task_measure_ctx *ctx)
}
}
- vfree(pid_buf);
+ dim_vfree(pid_buf);
return 0;
}
@@ -306,7 +304,7 @@ static int user_text_measure(int mode, struct dim_measure *m)
if (m == NULL)
return -EINVAL;
- ctx = vmalloc(sizeof(struct task_measure_ctx));
+ ctx = dim_vzalloc(sizeof(struct task_measure_ctx));
if (ctx == NULL)
return -ENOMEM;
@@ -315,7 +313,7 @@ static int user_text_measure(int mode, struct dim_measure *m)
ctx->check = check_process_digest;
ret = walk_measure_tasks(ctx);
- vfree(ctx);
+ dim_vfree(ctx);
return ret;
}
diff --git a/src/core/tasks/dim_core_measure_process/dim_core_measure_process_elf.c b/src/core/tasks/dim_core_measure_process/dim_core_measure_process_elf.c
index 9210f47..3821c7f 100644
--- a/src/core/tasks/dim_core_measure_process/dim_core_measure_process_elf.c
+++ b/src/core/tasks/dim_core_measure_process/dim_core_measure_process_elf.c
@@ -57,7 +57,7 @@ static int get_elf_phdrs(struct file *elf_file, struct elfhdr *ehdr,
return -ENOEXEC;
phdr_size = sizeof(struct elf_phdr) * ehdr->e_phnum;
- elf_phdata = dim_kmalloc_gfp(phdr_size);
+ elf_phdata = dim_kzalloc_gfp(phdr_size);
if (elf_phdata == NULL)
return -ENOMEM;
@@ -89,7 +89,7 @@ static int get_elf_section(struct file *elf_file, struct elfhdr *ehdr,
if (ehdr->e_shentsize != sizeof(struct elf_shdr))
return -EBADF;
- sh_table = dim_kmalloc_gfp(ehdr->e_shentsize);
+ sh_table = dim_kzalloc_gfp(ehdr->e_shentsize);
if (sh_table == NULL)
return -ENOMEM;
@@ -103,21 +103,21 @@ static int get_elf_section(struct file *elf_file, struct elfhdr *ehdr,
str_size = sh_table->sh_size;
if (str_size > i_size_read(file_inode(elf_file))) {
- kfree(sh_table);
+ dim_kfree(sh_table);
return -EBADF;
}
- sh_str = vmalloc(str_size);
+ sh_str = dim_vzalloc(str_size);
if (sh_str == NULL) {
- kfree(sh_table);
+ dim_kfree(sh_table);
return -ENOMEM;
}
pos = sh_table->sh_offset;
size = kernel_read(elf_file, sh_str, sh_table->sh_size, &pos);
if (size != sh_table->sh_size) {
- kfree(sh_table);
- vfree(sh_str);
+ dim_kfree(sh_table);
+ dim_vfree(sh_str);
return size < 0 ? (int)size : -EBADF;
}
@@ -135,15 +135,15 @@ static int get_elf_section(struct file *elf_file, struct elfhdr *ehdr,
sh_table->sh_name + name_len >= str_size)
break;
- if (strcmp(name, sh_str + sh_table->sh_name) == 0) {
+ if (dim_strcmp(name, sh_str + sh_table->sh_name) == 0) {
memcpy(shdr, sh_table, sizeof(struct elf_shdr));
ret = 0;
break;
}
}
- kfree(sh_table);
- vfree(sh_str);
+ dim_kfree(sh_table);
+ dim_vfree(sh_str);
return ret;
}
@@ -179,7 +179,7 @@ static int get_elf_text_phdrs(struct file *elf_file,
}
/* alloc memory buffer for phdrs */
- phdrs_text = dim_kmalloc_gfp(phdrs_text_num * sizeof(struct elf_phdr));
+ phdrs_text = dim_kzalloc_gfp(phdrs_text_num * sizeof(struct elf_phdr));
if (phdrs_text == NULL) {
dim_kfree(phdrs_get);
return -ENOMEM;
diff --git a/src/core/tasks/dim_core_measure_process/dim_vm_hash.c b/src/core/tasks/dim_core_measure_process/dim_vm_hash.c
index 0c59b9e..c3a8887 100644
--- a/src/core/tasks/dim_core_measure_process/dim_vm_hash.c
+++ b/src/core/tasks/dim_core_measure_process/dim_vm_hash.c
@@ -7,6 +7,7 @@
#include <linux/highmem.h>
#include "dim_utils.h"
+#include "dim_safe_func.h"
#include "dim_vm_hash.h"
@@ -26,7 +27,7 @@ int dim_vm_hash_update_address(struct mm_struct *mm,
if (mm == NULL || addr_len == 0 || shash == NULL)
return -EINVAL;
- pages = vzalloc(nr_pages * sizeof(struct page *));
+ pages = dim_vzalloc(nr_pages * sizeof(struct page *));
if (pages == NULL)
return -ENOMEM;
@@ -38,7 +39,7 @@ int dim_vm_hash_update_address(struct mm_struct *mm,
#endif
if (ret_pages < 0) {
dim_err("failed to get remote pages: %ld\n", ret_pages);
- vfree(pages);
+ dim_vfree(pages);
return ret_pages;
} else if (ret_pages != nr_pages) {
dim_warn("failed to get all remote pages\n");
@@ -64,7 +65,7 @@ int dim_vm_hash_update_address(struct mm_struct *mm,
put_page(pages[i]);
}
- vfree(pages);
+ dim_vfree(pages);
return 0;
}
diff --git a/src/measure/dim_measure_baseline.c b/src/measure/dim_measure_baseline.c
index dc358a7..c62d6be 100644
--- a/src/measure/dim_measure_baseline.c
+++ b/src/measure/dim_measure_baseline.c
@@ -16,7 +16,7 @@ static const char *process_static_name(const char *name, int type,
{
const char *kr = init_uts_ns.name.release;
- if (type != DIM_BASELINE_KERNEL || strcmp(name, kr) == 0)
+ if (type != DIM_BASELINE_KERNEL || dim_strcmp(name, kr) == 0)
return name;
/* name of kernel module has a kernel prefix in static baseline */
@@ -101,7 +101,7 @@ static int measure_log_add(struct dim_measure *m, const char *name,
/* check dynamic measurement result in baseline stage */
static int process_dynamic_baseline(struct dim_measure *m, const char *name,
- struct dim_digest *digest, int *log_flag) // TODO
+ struct dim_digest *digest, int *log_flag)
{
int ret = 0;
struct dim_digest digest_static = { 0 };
@@ -134,7 +134,7 @@ static int process_dynamic_measure(struct dim_measure *m, const char *name,
if(!dynamic_baseline_match(m, name, DIM_BASELINE_KERNEL, digest)) {
dim_err("mismatch dynamic baseline of kernel %s\n", name);
- if (log_flag != NULL) // TODO
+ if (log_flag != NULL)
*log_flag = LOG_TAMPERED;
return measure_log_add(m, name, digest, LOG_TAMPERED);
@@ -165,7 +165,7 @@ static int process_static_baseline(struct dim_measure *m, const char *name,
return measure_log_add(m, name, digest, LOG_STATIC_BASELINE);
dim_warn("mismatch static baseline of user process %s\n", name);
- if (log_flag != NULL) // TODO
+ if (log_flag != NULL)
*log_flag = LOG_TAMPERED;
return measure_log_add(m, name, digest, LOG_TAMPERED);
@@ -177,7 +177,7 @@ static int process_static_measure(struct dim_measure *m, const char *name,
{
if(!dynamic_baseline_match(m, name, DIM_BASELINE_USER, digest)) {
dim_err("mismatch dynamic baseline of user %s\n", name);
- if (log_flag != NULL) // TODO
+ if (log_flag != NULL)
*log_flag = LOG_TAMPERED;
return measure_log_add(m, name, digest, LOG_TAMPERED);
diff --git a/src/monitor/dim_monitor_main.c b/src/monitor/dim_monitor_main.c
index 4b3505d..d0e89f1 100644
--- a/src/monitor/dim_monitor_main.c
+++ b/src/monitor/dim_monitor_main.c
@@ -57,6 +57,10 @@ static void __exit dim_monitor_exit(void)
{
dim_monitor_measure_destroy();
dim_monitor_destroy_fs();
+
+ #ifdef DIM_DEBUG_MEMORY_LEAK
+ dim_check_memory_leak();
+ #endif
}
module_init(dim_monitor_init);
--
2.33.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化