gcc-plugins: arm_ssp_per_task_plugin: sign extend the SP mask

The ARM per-task stack protector GCC plugin hits an assert in
the compiler in some case, due to the fact the the SP mask
expression is not sign-extended as it should be. So fix that.

Suggested-by: Kugan Vivekanandarajah <kugan.vivekanandarajah@linaro.org>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
This commit is contained in:
Ard Biesheuvel 2019-01-18 11:58:06 +01:00 committed by Kees Cook
parent 1c7fc5cbc3
commit 560706d5d2
1 changed files with 3 additions and 2 deletions

View File

@ -13,7 +13,7 @@ static unsigned int arm_pertask_ssp_rtl_execute(void)
for (insn = get_insns(); insn; insn = NEXT_INSN(insn)) { for (insn = get_insns(); insn; insn = NEXT_INSN(insn)) {
const char *sym; const char *sym;
rtx body; rtx body;
rtx masked_sp; rtx mask, masked_sp;
/* /*
* Find a SET insn involving a SYMBOL_REF to __stack_chk_guard * Find a SET insn involving a SYMBOL_REF to __stack_chk_guard
@ -33,12 +33,13 @@ static unsigned int arm_pertask_ssp_rtl_execute(void)
* produces the address of the copy of the stack canary value * produces the address of the copy of the stack canary value
* stored in struct thread_info * stored in struct thread_info
*/ */
mask = GEN_INT(sext_hwi(sp_mask, GET_MODE_PRECISION(Pmode)));
masked_sp = gen_reg_rtx(Pmode); masked_sp = gen_reg_rtx(Pmode);
emit_insn_before(gen_rtx_SET(masked_sp, emit_insn_before(gen_rtx_SET(masked_sp,
gen_rtx_AND(Pmode, gen_rtx_AND(Pmode,
stack_pointer_rtx, stack_pointer_rtx,
GEN_INT(sp_mask))), mask)),
insn); insn);
SET_SRC(body) = gen_rtx_PLUS(Pmode, masked_sp, SET_SRC(body) = gen_rtx_PLUS(Pmode, masked_sp,