Skip to content

Commit

Permalink
gcc-plugins/stackleak: Exactly match strings instead of prefixes
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Kees Cook <[email protected]>
  • Loading branch information
kees committed Feb 6, 2022
1 parent f154066 commit 27e9faf
Showing 1 changed file with 21 additions and 4 deletions.
25 changes: 21 additions & 4 deletions scripts/gcc-plugins/stackleak_plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,23 @@ static unsigned int stackleak_cleanup_execute(void)
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)
{
tree section;
Expand All @@ -438,13 +455,13 @@ static bool stackleak_gate(void)
if (section && 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;
if (!strncmp(TREE_STRING_POINTER(section), ".devinit.text", 13))
if (STRING_EQUAL(section, ".devinit.text"))
return false;
if (!strncmp(TREE_STRING_POINTER(section), ".cpuinit.text", 13))
if (STRING_EQUAL(section, ".cpuinit.text"))
return false;
if (!strncmp(TREE_STRING_POINTER(section), ".meminit.text", 13))
if (STRING_EQUAL(section, ".meminit.text"))
return false;
}

Expand Down

0 comments on commit 27e9faf

Please sign in to comment.