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
363363 PASS_POS_INSERT_BEFORE);
364364
365365 /*
366− * The stackleak_cleanup pass should be executed after the
367− * "reload" pass, when the stack frame size is final.
366+ * The stackleak_cleanup pass should be executed before the "*free_cfg"
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.
368370 */
369− PASS_INFO(stackleak_cleanup, "reload", 1, PASS_POS_INSERT_AFTER);
371+ PASS_INFO(stackleak_cleanup, "*free_cfg", 1, PASS_POS_INSERT_BEFORE);
370372
371373 if (!plugin_default_version_check(version, &gcc_version)) {
372374 error(G_("incompatible gcc/plugin versions"));