Skip to content

Commit

Permalink
gcc-plugins: arm_ssp_per_task_plugin: fix for GCC 9+
Browse files Browse the repository at this point in the history
GCC 9 reworks the way the references to the stack canary are
emitted, to prevent the value from being spilled to the stack
before the final comparison in the epilogue, defeating the
purpose, given that the spill slot is under control of the
attacker that we are protecting ourselves from.

Since our canary value address is obtained without accessing
memory (as opposed to pre-v7 code that will obtain it from a
literal pool), it is unlikely (although not guaranteed) that
the compiler will spill the canary value in the same way, so
let's just disable this improvement when building with GCC9+.

Signed-off-by: Ard Biesheuvel <[email protected]>
Signed-off-by: Kees Cook <[email protected]>
  • Loading branch information
Ard Biesheuvel authored and kees committed Jan 20, 2019
1 parent 560706d commit 2c88c74
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions scripts/gcc-plugins/arm_ssp_per_task_plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,19 @@ static unsigned int arm_pertask_ssp_rtl_execute(void)
#define NO_GATE
#include "gcc-generate-rtl-pass.h"

#if BUILDING_GCC_VERSION >= 9000
static bool no(void)
{
return false;
}

static void arm_pertask_ssp_start_unit(void *gcc_data, void *user_data)
{
targetm.have_stack_protect_combined_set = no;
targetm.have_stack_protect_combined_test = no;
}
#endif

__visible int plugin_init(struct plugin_name_args *plugin_info,
struct plugin_gcc_version *version)
{
Expand Down Expand Up @@ -100,5 +113,10 @@ __visible int plugin_init(struct plugin_name_args *plugin_info,
register_callback(plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP,
NULL, &arm_pertask_ssp_rtl_pass_info);

#if BUILDING_GCC_VERSION >= 9000
register_callback(plugin_info->base_name, PLUGIN_START_UNIT,
arm_pertask_ssp_start_unit, NULL);
#endif

return 0;
}

0 comments on commit 2c88c74

Please sign in to comment.