gcc-plugins/stackleak: Exactly match strings instead of prefixes
[ Upstream commit 27e9faf415dbf94af19b9c827842435edbc1fbbc ] Since STRING_CST may not be NUL terminated, strncmp() was used for check for equality. However, this may lead to mismatches for longer section names where the start matches the tested-for string. Test for exact equality by checking for the presences of NUL termination. Cc: Alexander Popov <alex.popov@linux.com> Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
ddcdda888e
commit
f36dd10d1b
@ -262,6 +262,23 @@ static unsigned int stackleak_cleanup_execute(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* STRING_CST may or may not be NUL terminated:
|
||||||
|
* https://gcc.gnu.org/onlinedocs/gccint/Constant-expressions.html
|
||||||
|
*/
|
||||||
|
static inline bool string_equal(tree node, const char *string, int length)
|
||||||
|
{
|
||||||
|
if (TREE_STRING_LENGTH(node) < length)
|
||||||
|
return false;
|
||||||
|
if (TREE_STRING_LENGTH(node) > length + 1)
|
||||||
|
return false;
|
||||||
|
if (TREE_STRING_LENGTH(node) == length + 1 &&
|
||||||
|
TREE_STRING_POINTER(node)[length] != '\0')
|
||||||
|
return false;
|
||||||
|
return !memcmp(TREE_STRING_POINTER(node), string, length);
|
||||||
|
}
|
||||||
|
#define STRING_EQUAL(node, str) string_equal(node, str, strlen(str))
|
||||||
|
|
||||||
static bool stackleak_gate(void)
|
static bool stackleak_gate(void)
|
||||||
{
|
{
|
||||||
tree section;
|
tree section;
|
||||||
@ -271,13 +288,13 @@ static bool stackleak_gate(void)
|
|||||||
if (section && TREE_VALUE(section)) {
|
if (section && TREE_VALUE(section)) {
|
||||||
section = TREE_VALUE(TREE_VALUE(section));
|
section = TREE_VALUE(TREE_VALUE(section));
|
||||||
|
|
||||||
if (!strncmp(TREE_STRING_POINTER(section), ".init.text", 10))
|
if (STRING_EQUAL(section, ".init.text"))
|
||||||
return false;
|
return false;
|
||||||
if (!strncmp(TREE_STRING_POINTER(section), ".devinit.text", 13))
|
if (STRING_EQUAL(section, ".devinit.text"))
|
||||||
return false;
|
return false;
|
||||||
if (!strncmp(TREE_STRING_POINTER(section), ".cpuinit.text", 13))
|
if (STRING_EQUAL(section, ".cpuinit.text"))
|
||||||
return false;
|
return false;
|
||||||
if (!strncmp(TREE_STRING_POINTER(section), ".meminit.text", 13))
|
if (STRING_EQUAL(section, ".meminit.text"))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user