History

stackleak: Register the 'stackleak_cleanup' pass before the '*free_cfg' pass

Currently the 'stackleak_cleanup' pass deleting a CALL insn is executed after the 'reload' pass. That allows gcc to do some weird optimization in function prologues and epilogues, which are generated later [1]. Let's avoid that by registering the 'stackleak_cleanup' pass before the '*free_cfg' pass. It's the moment when the stack frame size is already final, function prologues and epilogues are generated, and the machine-dependent code transformations are not done. [1] https://www.openwall.com/lists/kernel-hardening/2018/11/23/2

Alexander Popov committed 7 years ago

Commit 8fb2dfb1 parent e9c7d651 file · +5 −3Browse files

Showing the changes to scripts (1 of 1 file). Show all

Unified · Split

scripts/gcc-plugins/stackleak_plugin.c+5−3
@@ -363,10 +363,12 @@ __visible int plugin_init(struct plugin_name_args *plugin_info, · 362 unmodified lines
363 PASS_POS_INSERT_BEFORE);363 PASS_POS_INSERT_BEFORE);
364 364
365 /*365 /*
366 * The stackleak_cleanup pass should be executed after the366 * The stackleak_cleanup pass should be executed before the "*free_cfg"
367 * "reload" pass, when the stack frame size is final.367 * pass. It's the moment when the stack frame size is already final,
368 * function prologues and epilogues are generated, and the
369 * machine-dependent code transformations are not done.
368 */370 */
369 PASS_INFO(stackleak_cleanup, "reload", 1, PASS_POS_INSERT_AFTER);371 PASS_INFO(stackleak_cleanup, "*free_cfg", 1, PASS_POS_INSERT_BEFORE);
370 372
371 if (!plugin_default_version_check(version, &gcc_version)) {373 if (!plugin_default_version_check(version, &gcc_version)) {
372 error(G_("incompatible gcc/plugin versions"));374 error(G_("incompatible gcc/plugin versions"));