From 36965d0690fd8ccef1593429b4f3a1bedf3671bc Mon Sep 17 00:00:00 2001 From: zhangyaqi Date: Mon, 20 May 2024 10:49:42 +0800 Subject: [PATCH] libkmod: clear file->memory if map fails --- backport-clear-file-memory-if-map-fails.patch | 41 +++++++++++++++++++ kmod.spec | 6 ++- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 backport-clear-file-memory-if-map-fails.patch diff --git a/backport-clear-file-memory-if-map-fails.patch b/backport-clear-file-memory-if-map-fails.patch new file mode 100644 index 0000000..3b44405 --- /dev/null +++ b/backport-clear-file-memory-if-map-fails.patch @@ -0,0 +1,41 @@ +From 90b271fbd2b9708a8fa79b7e98d90c7919e7ed73 Mon Sep 17 00:00:00 2001 +From: Emil Velikov +Date: Mon, 12 Feb 2024 17:23:05 +0000 +Subject: libkmod: clear file->memory if map fails + +On mmap failure file->memory is set to -1, which we'll happily pass down +to munmap later on. + +More importantly, since we do a NULL check in kmod_file_load_contents() +we will exit the function without (re)attempting the load again. + +Since we ignore the return code for the load function(s), one can end up +calling kmod_elf_get_memory() and feed that -1 into init_module. + +Signed-off-by: Emil Velikov +Reviewed-by: Lucas De Marchi +Signed-off-by: Lucas De Marchi + +--- + libkmod/libkmod-file.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/libkmod/libkmod-file.c b/libkmod/libkmod-file.c +index b6a8cc9..1e1dd35 100644 +--- a/libkmod/libkmod-file.c ++++ b/libkmod/libkmod-file.c +@@ -401,8 +401,10 @@ static int load_reg(struct kmod_file *file) + file->size = st.st_size; + file->memory = mmap(NULL, file->size, PROT_READ, MAP_PRIVATE, + file->fd, 0); +- if (file->memory == MAP_FAILED) ++ if (file->memory == MAP_FAILED) { ++ file->memory = NULL; + return -errno; ++ } + file->direct = true; + return 0; + } +-- +2.27.0 + diff --git a/kmod.spec b/kmod.spec index 5c90bc9..b092866 100644 --- a/kmod.spec +++ b/kmod.spec @@ -1,6 +1,6 @@ Name: kmod Version: 29 -Release: 7 +Release: 8 Summary: Kernel module management # GPLv2+ is used by programs, LGPLv2+ is used for libraries. License: GPLv2+ and LGPLv2+ @@ -18,6 +18,7 @@ Patch6000: backport-libkmod-do-not-crash-on-unknown-signature-algorithm.pat Patch6001: backport-libkmod-error-out-on-unknown-hash-algorithm.patch Patch6002: backport-libkmod-Set-builtin-to-no-when-module-is-created-fro.patch Patch6003: backport-modprobe-fix-the-NULL-termination-of-new_argv.patch +Patch6004: backport-clear-file-memory-if-map-fails.patch BuildRequires: gcc chrpath zlib-devel xz-devel libxslt openssl-devel @@ -125,6 +126,9 @@ install -m 0644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/depmod.d/dist.conf %doc TODO NEWS README %changelog +* Mon May 20 2024 zhangyaqi - 29-8 +- libkmod: clear file->memory if map fails + * Mon Apr 17 2023 Fang Chuangchuang - 29-7 - libkmod: Set builtin to no when module is created from path. modprobe: fix the NULL-termination of new_argv -- Gitee