From bfa6d75c60704e73b204b9ddcccd443e862ffa34 Mon Sep 17 00:00:00 2001 From: Hung-ying Tyan Date: Tue, 17 May 2016 18:49:10 +0800 Subject: [PATCH] Add -f to insmod When the flag is on, insmod will bypass vermagic and symbol version checking in the kernel. This is to make it possible to update kernel without recompiling kernel modules. BUG=28803994 Change-Id: Ib4be6999ef52baefd4210ee0d242360e43318907 --- init/builtins.cpp | 22 ++++++++++++---------- init/readme.txt | 7 +++++-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/init/builtins.cpp b/init/builtins.cpp index 89f6c68c8..98595da0e 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -44,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -66,13 +68,13 @@ static const int kTerminateServiceDelayMicroSeconds = 50000; -static int insmod(const char *filename, const char *options) { +static int insmod(const char *filename, const char *options, int flags) { int fd = open(filename, O_RDONLY | O_NOFOLLOW | O_CLOEXEC); if (fd == -1) { ERROR("insmod: open(\"%s\") failed: %s", filename, strerror(errno)); return -1; } - int rc = syscall(__NR_finit_module, fd, options, 0); + int rc = syscall(__NR_finit_module, fd, options, flags); if (rc == -1) { ERROR("finit_module for \"%s\" failed: %s", filename, strerror(errno)); } @@ -269,17 +271,17 @@ static int do_ifup(const std::vector& args) { } static int do_insmod(const std::vector& args) { - std::string options; + int flags = 0; + auto it = args.begin() + 1; - if (args.size() > 2) { - options += args[2]; - for (std::size_t i = 3; i < args.size(); ++i) { - options += ' '; - options += args[i]; - } + if (!(*it).compare("-f")) { + flags = MODULE_INIT_IGNORE_VERMAGIC | MODULE_INIT_IGNORE_MODVERSIONS; + it++; } - return insmod(args[1].c_str(), options.c_str()); + std::string filename = *it++; + std::string options = android::base::Join(std::vector(it, args.end()), ' '); + return insmod(filename.c_str(), options.c_str(), flags); } static int do_mkdir(const std::vector& args) { diff --git a/init/readme.txt b/init/readme.txt index aa372eb92..c25a59ab1 100644 --- a/init/readme.txt +++ b/init/readme.txt @@ -278,8 +278,11 @@ hostname ifup Bring the network interface online. -insmod - Install the module at +insmod [-f] [] + Install the module at with the specified options. + -f + Force installation of the module even if the version of the running kernel + and the version of the kernel for which the module was compiled do not match. load_all_props Loads properties from /system, /vendor, et cetera.