summaryrefslogtreecommitdiff
path: root/aports/busybox/0001-modutils-check-ELF-header-before-calling-finit_module.patch
diff options
context:
space:
mode:
Diffstat (limited to 'aports/busybox/0001-modutils-check-ELF-header-before-calling-finit_module.patch')
-rw-r--r--aports/busybox/0001-modutils-check-ELF-header-before-calling-finit_module.patch152
1 files changed, 0 insertions, 152 deletions
diff --git a/aports/busybox/0001-modutils-check-ELF-header-before-calling-finit_module.patch b/aports/busybox/0001-modutils-check-ELF-header-before-calling-finit_module.patch
deleted file mode 100644
index 813010e..0000000
--- a/aports/busybox/0001-modutils-check-ELF-header-before-calling-finit_module.patch
+++ /dev/null
@@ -1,152 +0,0 @@
-Patch-Source: http://lists.busybox.net/pipermail/busybox/2021-January/088398.html
-Patch-Source: http://lists.busybox.net/pipermail/busybox/2021-January/088399.html
-See-Also: https://gitlab.alpinelinux.org/alpine/aports/-/issues/13427
-
-The purpose of this patch is to remove confusing error messages
-"Module has invalid ELF structures" produced by kernel when loading gzip
-compressed kernel modules using busybox modprobe.
---
-From: Qu Wenruo <wqu@suse.com>
-Date: Sun, 03 Jan 2021 04:10:52 +0000
-Subject: [PATCH v2] modutils: check ELF header before calling finit_module()
-
-finit_module() and init_module() system calls have clear specification
-to only accept valid ELF image.
-
-Although we try finit_module() on compressed modules to let the kernel
-determine if it's an ELF image, but it's not ideal, especially when
-newer kernel will complain when some invalid files/memory is passed in.
-
-Treat the kernel better by just doing a very basic ELF header check
-before calling finit_module().
-
-Signed-off-by: Qu Wenruo <wqu at suse.com>
-
-diff --git a/modutils/modutils.c b/modutils/modutils.c
-index f7ad5e8058fe..037d609e42df 100644
---- a/modutils/modutils.c
-+++ b/modutils/modutils.c
-@@ -7,6 +7,7 @@
- */
- #include "modutils.h"
-
-+#include <elf.h>
- #include <sys/syscall.h>
-
- #define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)
-@@ -186,6 +187,33 @@ void* FAST_FUNC try_to_mmap_module(const char *filename, size_t *image_size_p)
- }
- #endif
-
-+#ifdef __NR_finit_module
-+/*
-+ * Return:
-+ * 0 on success,
-+ * <0 for error.
-+ *
-+ * finit_module()/init_module() only accepts ELF format.
-+ * Do basic ELF check to avoid calling finit_module() with compressed module.
-+ */
-+static int check_elf_header(int fd)
-+{
-+ unsigned char buf[EI_NIDENT];
-+ int ret;
-+
-+ ret = pread(fd, buf, sizeof(buf), 0);
-+ if (ret < sizeof(buf))
-+ return -EIO;
-+ if (buf[EI_MAG0] != ELFMAG0 ||
-+ buf[EI_MAG1] != ELFMAG1 ||
-+ buf[EI_MAG2] != ELFMAG2 ||
-+ buf[EI_MAG3] != ELFMAG3)
-+ return -EINVAL;
-+ /* Other more comprehensive check will be done inside kernel */
-+ return 0;
-+}
-+#endif
-+
- /* Return:
- * 0 on success,
- * -errno on open/read error,
-@@ -212,12 +240,19 @@ int FAST_FUNC bb_init_module(const char *filename, const char *options)
- * to only allow loading of modules off of secure storage (like a read-
- * only rootfs) which needs the finit_module call. If it fails, we fall
- * back to normal module loading to support compressed modules.
-+ *
-+ * Note that finit_module()/init_module() only accept ELF image, do
-+ * basic check before calling finit_module() to avoid kernel
-+ * complaining.
- */
- # ifdef __NR_finit_module
- {
- int fd = open(filename, O_RDONLY | O_CLOEXEC);
- if (fd >= 0) {
-- rc = finit_module(fd, options, 0) != 0;
-+ if (!check_elf_header(fd))
-+ rc = finit_module(fd, options, 0) != 0;
-+ else
-+ rc = 1;
- close(fd);
- if (rc == 0)
- return rc;
-
-diff --git a/modutils/modprobe-small.c b/modutils/modprobe-small.c
-index db44a2ed0ab5..d2cd6a64c1d0 100644
---- a/modutils/modprobe-small.c
-+++ b/modutils/modprobe-small.c
-@@ -24,6 +24,7 @@
- //kbuild:lib-$(CONFIG_MODPROBE_SMALL) += modprobe-small.o
-
- #include "libbb.h"
-+#include <elf.h> /* for ELF header magic */
- /* After libbb.h, since it needs sys/types.h on some systems */
- #include <sys/utsname.h> /* uname() */
- #include <fnmatch.h>
-@@ -249,6 +250,33 @@ static const char *moderror(int err)
- }
- }
-
-+#ifdef __NR_finit_module
-+/*
-+ * Return:
-+ * 0 on success,
-+ * <0 for error.
-+ *
-+ * finit_module()/init_module() only accepts ELF format.
-+ * Do basic ELF check to avoid calling finit_module() with compressed module.
-+ */
-+static int check_elf_header(int fd)
-+{
-+ unsigned char buf[EI_NIDENT];
-+ int ret;
-+
-+ ret = pread(fd, buf, sizeof(buf), 0);
-+ if (ret < sizeof(buf))
-+ return -EIO;
-+ if (buf[EI_MAG0] != ELFMAG0 ||
-+ buf[EI_MAG1] != ELFMAG1 ||
-+ buf[EI_MAG2] != ELFMAG2 ||
-+ buf[EI_MAG3] != ELFMAG3)
-+ return -EINVAL;
-+ /* Other more comprehensive check will be done inside kernel */
-+ return 0;
-+}
-+#endif
-+
- static int load_module(const char *fname, const char *options)
- {
- #if 1
-@@ -272,7 +300,10 @@ static int load_module(const char *fname, const char *options)
- {
- int fd = open(fname, O_RDONLY | O_CLOEXEC);
- if (fd >= 0) {
-- r = finit_module(fd, options, 0) != 0;
-+ if (!check_elf_header(fd))
-+ r = finit_module(fd, options, 0) != 0;
-+ else
-+ r = 1;
- close(fd);
- }
- }
---
-2.29.2