Commit 9ea1e8d2 authored by Kees Cook's avatar Kees Cook
Browse files

stackleak: Rename stackleak_track_stack to __sanitizer_cov_stack_depth

The Clang stack depth tracking implementation has a fixed name for
the stack depth tracking callback, "__sanitizer_cov_stack_depth", so
rename the GCC plugin function to match since the plugin has no external
dependencies on naming.

Link: https://lore.kernel.org/r/20250717232519.2984886-2-kees@kernel.org


Signed-off-by: default avatarKees Cook <kees@kernel.org>
parent 57fbad15
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@ static inline void stackleak_task_init(struct task_struct *t)
asmlinkage void noinstr stackleak_erase(void);
asmlinkage void noinstr stackleak_erase_on_task_stack(void);
asmlinkage void noinstr stackleak_erase_off_task_stack(void);
void __no_caller_saved_registers noinstr stackleak_track_stack(void);
void __no_caller_saved_registers noinstr __sanitizer_cov_stack_depth(void);

#else /* !CONFIG_KSTACK_ERASE */
static inline void stackleak_task_init(struct task_struct *t) { }
+2 −2
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ asmlinkage void noinstr stackleak_erase_off_task_stack(void)
	__stackleak_erase(false);
}

void __used __no_caller_saved_registers noinstr stackleak_track_stack(void)
void __used __no_caller_saved_registers noinstr __sanitizer_cov_stack_depth(void)
{
	unsigned long sp = current_stack_pointer;

@@ -174,4 +174,4 @@ void __used __no_caller_saved_registers noinstr stackleak_track_stack(void)
		current->lowest_stack = sp;
	}
}
EXPORT_SYMBOL(stackleak_track_stack);
EXPORT_SYMBOL(__sanitizer_cov_stack_depth);
+26 −26
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@
 * any of the gcc libraries
 *
 * This gcc plugin is needed for tracking the lowest border of the kernel stack.
 * It instruments the kernel code inserting stackleak_track_stack() calls:
 * It instruments the kernel code inserting __sanitizer_cov_stack_depth() calls:
 *  - after alloca();
 *  - for the functions with a stack frame size greater than or equal
 *     to the "track-min-size" plugin parameter.
@@ -33,7 +33,7 @@ __visible int plugin_is_GPL_compatible;

static int track_frame_size = -1;
static bool build_for_x86 = false;
static const char track_function[] = "stackleak_track_stack";
static const char track_function[] = "__sanitizer_cov_stack_depth";
static bool disable = false;
static bool verbose = false;

@@ -58,7 +58,7 @@ static void add_stack_tracking_gcall(gimple_stmt_iterator *gsi, bool after)
	cgraph_node_ptr node;
	basic_block bb;

	/* Insert calling stackleak_track_stack() */
	/* Insert calling __sanitizer_cov_stack_depth() */
	stmt = gimple_build_call(track_function_decl, 0);
	gimple_call = as_a_gcall(stmt);
	if (after)
@@ -120,12 +120,12 @@ static void add_stack_tracking_gasm(gimple_stmt_iterator *gsi, bool after)
	gcc_assert(build_for_x86);

	/*
	 * Insert calling stackleak_track_stack() in asm:
	 *   asm volatile("call stackleak_track_stack"
	 * Insert calling __sanitizer_cov_stack_depth() in asm:
	 *   asm volatile("call __sanitizer_cov_stack_depth"
	 *		  :: "r" (current_stack_pointer))
	 * Use ASM_CALL_CONSTRAINT trick from arch/x86/include/asm/asm.h.
	 * This constraint is taken into account during gcc shrink-wrapping
	 * optimization. It is needed to be sure that stackleak_track_stack()
	 * optimization. It is needed to be sure that __sanitizer_cov_stack_depth()
	 * call is inserted after the prologue of the containing function,
	 * when the stack frame is prepared.
	 */
@@ -137,7 +137,7 @@ static void add_stack_tracking_gasm(gimple_stmt_iterator *gsi, bool after)
	input = build_tree_list(NULL_TREE, build_const_char_string(2, "r"));
	input = chainon(NULL_TREE, build_tree_list(input, sp_decl));
	vec_safe_push(inputs, input);
	asm_call = gimple_build_asm_vec("call stackleak_track_stack",
	asm_call = gimple_build_asm_vec("call __sanitizer_cov_stack_depth",
					inputs, NULL, NULL, NULL);
	gimple_asm_set_volatile(asm_call, true);
	if (after)
@@ -151,11 +151,11 @@ static void add_stack_tracking(gimple_stmt_iterator *gsi, bool after)
{
	/*
	 * The 'no_caller_saved_registers' attribute is used for
	 * stackleak_track_stack(). If the compiler supports this attribute for
	 * the target arch, we can add calling stackleak_track_stack() in asm.
	 * __sanitizer_cov_stack_depth(). If the compiler supports this attribute for
	 * the target arch, we can add calling __sanitizer_cov_stack_depth() in asm.
	 * That improves performance: we avoid useless operations with the
	 * caller-saved registers in the functions from which we will remove
	 * stackleak_track_stack() call during the stackleak_cleanup pass.
	 * __sanitizer_cov_stack_depth() call during the stackleak_cleanup pass.
	 */
	if (lookup_attribute_spec(get_identifier("no_caller_saved_registers")))
		add_stack_tracking_gasm(gsi, after);
@@ -165,7 +165,7 @@ static void add_stack_tracking(gimple_stmt_iterator *gsi, bool after)

/*
 * Work with the GIMPLE representation of the code. Insert the
 * stackleak_track_stack() call after alloca() and into the beginning
 * __sanitizer_cov_stack_depth() call after alloca() and into the beginning
 * of the function if it is not instrumented.
 */
static unsigned int stackleak_instrument_execute(void)
@@ -205,7 +205,7 @@ static unsigned int stackleak_instrument_execute(void)
					DECL_NAME_POINTER(current_function_decl));
			}

			/* Insert stackleak_track_stack() call after alloca() */
			/* Insert __sanitizer_cov_stack_depth() call after alloca() */
			add_stack_tracking(&gsi, true);
			if (bb == entry_bb)
				prologue_instrumented = true;
@@ -241,7 +241,7 @@ static unsigned int stackleak_instrument_execute(void)
		return 0;
	}

	/* Insert stackleak_track_stack() call at the function beginning */
	/* Insert __sanitizer_cov_stack_depth() call at the function beginning */
	bb = entry_bb;
	if (!single_pred_p(bb)) {
		/* gcc_assert(bb_loop_depth(bb) ||
@@ -270,15 +270,15 @@ static void remove_stack_tracking_gcall(void)
	rtx_insn *insn, *next;

	/*
	 * Find stackleak_track_stack() calls. Loop through the chain of insns,
	 * Find __sanitizer_cov_stack_depth() calls. Loop through the chain of insns,
	 * which is an RTL representation of the code for a function.
	 *
	 * The example of a matching insn:
	 *  (call_insn 8 4 10 2 (call (mem (symbol_ref ("stackleak_track_stack")
	 *  [flags 0x41] <function_decl 0x7f7cd3302a80 stackleak_track_stack>)
	 *  [0 stackleak_track_stack S1 A8]) (0)) 675 {*call} (expr_list
	 *  (symbol_ref ("stackleak_track_stack") [flags 0x41] <function_decl
	 *  0x7f7cd3302a80 stackleak_track_stack>) (expr_list (0) (nil))) (nil))
	 *  (call_insn 8 4 10 2 (call (mem (symbol_ref ("__sanitizer_cov_stack_depth")
	 *  [flags 0x41] <function_decl 0x7f7cd3302a80 __sanitizer_cov_stack_depth>)
	 *  [0 __sanitizer_cov_stack_depth S1 A8]) (0)) 675 {*call} (expr_list
	 *  (symbol_ref ("__sanitizer_cov_stack_depth") [flags 0x41] <function_decl
	 *  0x7f7cd3302a80 __sanitizer_cov_stack_depth>) (expr_list (0) (nil))) (nil))
	 */
	for (insn = get_insns(); insn; insn = next) {
		rtx body;
@@ -318,7 +318,7 @@ static void remove_stack_tracking_gcall(void)
		if (SYMBOL_REF_DECL(body) != track_function_decl)
			continue;

		/* Delete the stackleak_track_stack() call */
		/* Delete the __sanitizer_cov_stack_depth() call */
		delete_insn_and_edges(insn);
#if BUILDING_GCC_VERSION < 8000
		if (GET_CODE(next) == NOTE &&
@@ -340,12 +340,12 @@ static bool remove_stack_tracking_gasm(void)
	gcc_assert(build_for_x86);

	/*
	 * Find stackleak_track_stack() asm calls. Loop through the chain of
	 * Find __sanitizer_cov_stack_depth() asm calls. Loop through the chain of
	 * insns, which is an RTL representation of the code for a function.
	 *
	 * The example of a matching insn:
	 *  (insn 11 5 12 2 (parallel [ (asm_operands/v
	 *  ("call stackleak_track_stack") ("") 0
	 *  ("call __sanitizer_cov_stack_depth") ("") 0
	 *  [ (reg/v:DI 7 sp [ current_stack_pointer ]) ]
	 *  [ (asm_input:DI ("r")) ] [])
	 *  (clobber (reg:CC 17 flags)) ]) -1 (nil))
@@ -375,7 +375,7 @@ static bool remove_stack_tracking_gasm(void)
			continue;

		if (strcmp(ASM_OPERANDS_TEMPLATE(body),
						"call stackleak_track_stack")) {
						"call __sanitizer_cov_stack_depth")) {
			continue;
		}

@@ -389,7 +389,7 @@ static bool remove_stack_tracking_gasm(void)

/*
 * Work with the RTL representation of the code.
 * Remove the unneeded stackleak_track_stack() calls from the functions
 * Remove the unneeded __sanitizer_cov_stack_depth() calls from the functions
 * which don't call alloca() and don't have a large enough stack frame size.
 */
static unsigned int stackleak_cleanup_execute(void)
@@ -474,13 +474,13 @@ static bool stackleak_gate(void)
	return track_frame_size >= 0;
}

/* Build the function declaration for stackleak_track_stack() */
/* Build the function declaration for __sanitizer_cov_stack_depth() */
static void stackleak_start_unit(void *gcc_data __unused,
				 void *user_data __unused)
{
	tree fntype;

	/* void stackleak_track_stack(void) */
	/* void __sanitizer_cov_stack_depth(void) */
	fntype = build_function_type_list(void_type_node, NULL_TREE);
	track_function_decl = build_fn_decl(track_function, fntype);
	DECL_ASSEMBLER_NAME(track_function_decl); /* for LTO */
+2 −2
Original line number Diff line number Diff line
@@ -129,8 +129,8 @@ config KSTACK_ERASE_TRACK_MIN_SIZE
	help
	  The KSTACK_ERASE option instruments the kernel code for tracking
	  the lowest border of the kernel stack (and for some other purposes).
	  It inserts the stackleak_track_stack() call for the functions with
	  a stack frame size greater than or equal to this parameter.
	  It inserts the __sanitizer_cov_stack_depth() call for the functions
	  with a stack frame size greater than or equal to this parameter.
	  If unsure, leave the default value 100.

config KSTACK_ERASE_METRICS
+1 −1
Original line number Diff line number Diff line
@@ -1193,7 +1193,7 @@ static const char *uaccess_safe_builtin[] = {
	"__ubsan_handle_shift_out_of_bounds",
	"__ubsan_handle_load_invalid_value",
	/* KSTACK_ERASE */
	"stackleak_track_stack",
	"__sanitizer_cov_stack_depth",
	/* TRACE_BRANCH_PROFILING */
	"ftrace_likely_update",
	/* STACKPROTECTOR */