From 141983790dbc0568e9a4a7d58eb27fddcc661f0f Mon Sep 17 00:00:00 2001 From: hamza Date: Thu, 8 May 2025 21:44:13 +0200 Subject: [PATCH] - fixed a1.2 memory leaks and documented in a1.2.txt --- a1.2.config | 3 ++- a1.2.txt | 9 +++++++++ drivers/sst/Makefile | 3 +++ drivers/sst/sst_chrdev.c | 8 ++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 a1.2.txt diff --git a/a1.2.config b/a1.2.config index ff905b05fba8..7c999e405546 100644 --- a/a1.2.config +++ b/a1.2.config @@ -3755,6 +3755,7 @@ CONFIG_NVMEM_SYSFS=y # CONFIG_PECI is not set # CONFIG_HTE is not set CONFIG_SST=y + # CONFIG_SST_BOUNDS is not set # CONFIG_SST_ASYNC_SOURCE is not set # end of Device Drivers @@ -4444,7 +4445,7 @@ CONFIG_PTDUMP_CORE=y # CONFIG_DEBUG_OBJECTS is not set # CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y -# CONFIG_DEBUG_KMEMLEAK is not set +CONFIG_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y diff --git a/a1.2.txt b/a1.2.txt new file mode 100644 index 000000000000..531d67e79c82 --- /dev/null +++ b/a1.2.txt @@ -0,0 +1,9 @@ +1) a) um debug beim start des kerns zu aktivieren, reicht im Makefile die Debug output flags zu schalten: CFLAGS_sst_chrdev.o := -DDEBUG + CFLAGS_sst_common.o := -DDEBUG + CFLAGS_boundedbuffer.o := -DDEBUG +2) Mein grundlegendes Verständnis davon, wie kmemleak funktioniert, ist, dass jede neue Speicherzuweisung und ihre Zeiger zusammen mit einer Vielzahl von Metainformationen wie Größe verfolgt werden. + Informationen wie z.B. der Größe verfolgt und in einer Baumstruktur (rbtree) gespeichert wird. + einen Memory Allocator existiert, bedeutet dies, dass der Kernel nicht mehr in der Lage ist, ihn zu zerstören und er wird als Orphan bezeichnet. + + +3) um detector standardmäßige auszuschalten, kann mann CONFIG_DEBUG_KMEMLEAK=n setzen oder entfernen im kconfig \ No newline at end of file diff --git a/drivers/sst/Makefile b/drivers/sst/Makefile index 446c0c70371f..9695302c1faa 100644 --- a/drivers/sst/Makefile +++ b/drivers/sst/Makefile @@ -4,3 +4,6 @@ # obj-$(CONFIG_SST) += sst_chrdev.o boundedbuffer.o sst_common.o +CFLAGS_sst_chrdev.o := -DDEBUG +CFLAGS_sst_common.o := -DDEBUG +CFLAGS_boundedbuffer.o := -DDEBUG \ No newline at end of file diff --git a/drivers/sst/sst_chrdev.c b/drivers/sst/sst_chrdev.c index 06f03743be65..bd1152e2233b 100644 --- a/drivers/sst/sst_chrdev.c +++ b/drivers/sst/sst_chrdev.c @@ -1,9 +1,12 @@ #include "sst_internal.h" +#include "../../include/linux/slab.h" + #include #include #include #include #include +#include #define SST_CHRDEV "the-universe" @@ -30,6 +33,7 @@ static ssize_t universe_read(struct file *file, char __user *buf, size_t count, if (sst_consume_answer(sst_info, &answer)) { pr_debug("Cannot read from answers!\n"); + kfree(answer); return 0; } len = strlen(answer); @@ -40,10 +44,12 @@ static ssize_t universe_read(struct file *file, char __user *buf, size_t count, } if (copy_to_user(buf, answer, min)) { pr_err("User copy failed!\n"); + kfree(answer); return -EFAULT; } sst_debug("Copied %u bytes of your answer to the userspace: %s\n", min, answer); *ppos += len; + kfree(answer); return len; } @@ -60,9 +66,11 @@ static ssize_t universe_write(struct file *file, const char __user *buf, size_t err = sst_produce_question(sst_info, buf_copy); if (err) { pr_err("Weird! The universe is full.\n"); + kfree(buf_copy); return -ENOMEM; } sst_debug("Asked the universe a question...\n"); + kfree(buf_copy); return count; }