There are more than one functions called cmp_name() and at least one of
them is exported. Let's namespace this one to avoid any confusion or
collisions.
kernel/module/gki_module.c:27:12: error: static declaration of 'cmp_name' follows non-static declaration
27 | static int cmp_name(const void *sym, const void *protected_sym)
| ^
kernel/module/internal.h:109:5: note: previous declaration is here
109 | int cmp_name(const void *name, const void *sym);
| ^
Fixes: e9669eeb2f ("ANDROID: GKI: Add module load time symbol protection")
Signed-off-by: Lee Jones <joneslee@google.com>
Change-Id: I8f85c6b9546ab1547f8a5200919888249c9d7592
71 lines
2.0 KiB
C
71 lines
2.0 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Copyright 2022 Google LLC
|
|
* Author: ramjiyani@google.com (Ramji Jiyani)
|
|
*/
|
|
|
|
#include <linux/bsearch.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/printk.h>
|
|
#include <linux/string.h>
|
|
|
|
#include "internal.h"
|
|
|
|
/*
|
|
* Build time generated header files
|
|
*
|
|
* gki_module_protected_exports.h -- Symbols protected from _export_ by unsigned modules
|
|
* gki_module_unprotected.h -- Symbols allowed to _access_ by unsigned modules
|
|
*/
|
|
#include <generated/gki_module_protected_exports.h>
|
|
#include <generated/gki_module_unprotected.h>
|
|
|
|
#define MAX_STRCMP_LEN (max(MAX_UNPROTECTED_NAME_LEN, MAX_PROTECTED_EXPORTS_NAME_LEN))
|
|
|
|
/* bsearch() comparision callback */
|
|
static int gki_cmp_name(const void *sym, const void *protected_sym)
|
|
{
|
|
return strncmp(sym, protected_sym, MAX_STRCMP_LEN);
|
|
}
|
|
|
|
/**
|
|
* gki_is_module_protected_export - Is a symbol exported from a protected GKI module?
|
|
*
|
|
* @name: Symbol being checked against exported symbols from protected GKI modules
|
|
*/
|
|
bool gki_is_module_protected_export(const char *name)
|
|
{
|
|
if (NR_UNPROTECTED_SYMBOLS) {
|
|
return bsearch(name, gki_protected_exports_symbols, NR_PROTECTED_EXPORTS_SYMBOLS,
|
|
MAX_PROTECTED_EXPORTS_NAME_LEN, gki_cmp_name) != NULL;
|
|
} else {
|
|
/*
|
|
* If there are no symbols in unprotected list; We don't need to
|
|
* protect exports as there is no KMI enforcement.
|
|
* Treat everything exportable in this case.
|
|
*/
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* gki_is_module_unprotected_symbol - Is a symbol unprotected for unsigned module?
|
|
*
|
|
* @name: Symbol being checked in list of unprotected symbols
|
|
*/
|
|
bool gki_is_module_unprotected_symbol(const char *name)
|
|
{
|
|
if (NR_UNPROTECTED_SYMBOLS) {
|
|
return bsearch(name, gki_unprotected_symbols, NR_UNPROTECTED_SYMBOLS,
|
|
MAX_UNPROTECTED_NAME_LEN, gki_cmp_name) != NULL;
|
|
} else {
|
|
/*
|
|
* If there are no symbols in unprotected list;
|
|
* there isn't a KMI enforcement for the kernel.
|
|
* Treat everything accessible in this case.
|
|
*/
|
|
return true;
|
|
}
|
|
}
|