mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-03 18:20:25 +02:00 
			
		
		
		
	gcc-plugins/stackleak: Exactly match strings instead of prefixes
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>
This commit is contained in:
		
							parent
							
								
									f154066b61
								
							
						
					
					
						commit
						27e9faf415
					
				
					 1 changed files with 21 additions and 4 deletions
				
			
		| 
						 | 
					@ -429,6 +429,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;
 | 
				
			||||||
| 
						 | 
					@ -438,13 +455,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 a new issue