mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-08 21:22:09 -04:00
Revert "ANDROID: Revert "Merge tag 'modules-for-v5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux""
This reverts commit 3fde1dfb00.
Revert to the upstream version by reinstating the original
modules-for-v5.4 merge.
Bug: 142892219
Bug: 144336692
Change-Id: I3871c67dd3cba0a5b9b2e1a87be8653a14cb9de5
Signed-off-by: Matthias Maennich <maennich@google.com>
This commit is contained in:
parent
bf868444c2
commit
537d1f70d1
29 changed files with 373 additions and 69 deletions
|
|
@ -545,12 +545,20 @@ static const char *kernel_symbol_name(const struct kernel_symbol *sym)
|
|||
#endif
|
||||
}
|
||||
|
||||
static int cmp_name(const void *va, const void *vb)
|
||||
static const char *kernel_symbol_namespace(const struct kernel_symbol *sym)
|
||||
{
|
||||
const char *a;
|
||||
const struct kernel_symbol *b;
|
||||
a = va; b = vb;
|
||||
return strcmp(a, kernel_symbol_name(b));
|
||||
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
|
||||
if (!sym->namespace_offset)
|
||||
return NULL;
|
||||
return offset_to_ptr(&sym->namespace_offset);
|
||||
#else
|
||||
return sym->namespace;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int cmp_name(const void *name, const void *sym)
|
||||
{
|
||||
return strcmp(name, kernel_symbol_name(sym));
|
||||
}
|
||||
|
||||
static bool find_exported_symbol_in_section(const struct symsearch *syms,
|
||||
|
|
@ -1380,6 +1388,41 @@ static inline int same_magic(const char *amagic, const char *bmagic,
|
|||
}
|
||||
#endif /* CONFIG_MODVERSIONS */
|
||||
|
||||
static char *get_modinfo(const struct load_info *info, const char *tag);
|
||||
static char *get_next_modinfo(const struct load_info *info, const char *tag,
|
||||
char *prev);
|
||||
|
||||
static int verify_namespace_is_imported(const struct load_info *info,
|
||||
const struct kernel_symbol *sym,
|
||||
struct module *mod)
|
||||
{
|
||||
const char *namespace;
|
||||
char *imported_namespace;
|
||||
|
||||
namespace = kernel_symbol_namespace(sym);
|
||||
if (namespace) {
|
||||
imported_namespace = get_modinfo(info, "import_ns");
|
||||
while (imported_namespace) {
|
||||
if (strcmp(namespace, imported_namespace) == 0)
|
||||
return 0;
|
||||
imported_namespace = get_next_modinfo(
|
||||
info, "import_ns", imported_namespace);
|
||||
}
|
||||
#ifdef CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS
|
||||
pr_warn(
|
||||
#else
|
||||
pr_err(
|
||||
#endif
|
||||
"%s: module uses symbol (%s) from namespace %s, but does not import it.\n",
|
||||
mod->name, kernel_symbol_name(sym), namespace);
|
||||
#ifndef CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS
|
||||
return -EINVAL;
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Resolve a symbol for this module. I.e. if we find one, record usage. */
|
||||
static const struct kernel_symbol *resolve_symbol(struct module *mod,
|
||||
const struct load_info *info,
|
||||
|
|
@ -1408,6 +1451,12 @@ static const struct kernel_symbol *resolve_symbol(struct module *mod,
|
|||
goto getname;
|
||||
}
|
||||
|
||||
err = verify_namespace_is_imported(info, sym, mod);
|
||||
if (err) {
|
||||
sym = ERR_PTR(err);
|
||||
goto getname;
|
||||
}
|
||||
|
||||
err = ref_module(mod, owner);
|
||||
if (err) {
|
||||
sym = ERR_PTR(err);
|
||||
|
|
@ -2482,7 +2531,8 @@ static char *next_string(char *string, unsigned long *secsize)
|
|||
return string;
|
||||
}
|
||||
|
||||
static char *get_modinfo(struct load_info *info, const char *tag)
|
||||
static char *get_next_modinfo(const struct load_info *info, const char *tag,
|
||||
char *prev)
|
||||
{
|
||||
char *p;
|
||||
unsigned int taglen = strlen(tag);
|
||||
|
|
@ -2493,13 +2543,25 @@ static char *get_modinfo(struct load_info *info, const char *tag)
|
|||
* get_modinfo() calls made before rewrite_section_headers()
|
||||
* must use sh_offset, as sh_addr isn't set!
|
||||
*/
|
||||
for (p = (char *)info->hdr + infosec->sh_offset; p; p = next_string(p, &size)) {
|
||||
char *modinfo = (char *)info->hdr + infosec->sh_offset;
|
||||
|
||||
if (prev) {
|
||||
size -= prev - modinfo;
|
||||
modinfo = next_string(prev, &size);
|
||||
}
|
||||
|
||||
for (p = modinfo; p; p = next_string(p, &size)) {
|
||||
if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
|
||||
return p + taglen + 1;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *get_modinfo(const struct load_info *info, const char *tag)
|
||||
{
|
||||
return get_next_modinfo(info, tag, NULL);
|
||||
}
|
||||
|
||||
static void setup_modinfo(struct module *mod, struct load_info *info)
|
||||
{
|
||||
struct module_attribute *attr;
|
||||
|
|
|
|||
Loading…
Reference in a new issue