Hi all,
I find a potential Use-after-free bug in QEMU 6.2.0, which is in
handle_simd_shift_fpint_conv()(./target/arm/translate-a64.c).
At line 9048, a variable 'tcg_fpstatus' is freed by invoking
tcg_temp_free_ptr(). However, at line 9050, the variable 'tcg_fpstatus' is
subsequently use as the 3rd parameter of the function gen_helper_set_rmode.
This may result in a use-after-free bug.
9048 tcg_temp_free_ptr(tcg_fpstatus);
9049 tcg_temp_free_i32(tcg_shift);
9050 gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
I believe the bug can be fixed by invoking the gen_helper_set_rmode() before
'tcg_fpstatus' being freed by the tcg_temp_free_ptr().
--- tcg_temp_free_ptr(tcg_fpstatus);
9049 tcg_temp_free_i32(tcg_shift);
9050 gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
+++ tcg_temp_free_ptr(tcg_fpstatus);
I'm looking forward to your confirmation.
Best,
Wentao
--- ./target/arm/translate-a64.c 2022-02-23 15:06:32.212756633 +0800
+++ ./target/arm/translate-a64-PATCH.c 2022-02-23 21:13:15.604128138 +0800
@@ -9045,9 +9045,9 @@
}
}
- tcg_temp_free_ptr(tcg_fpstatus);
tcg_temp_free_i32(tcg_shift);
gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
+ tcg_temp_free_ptr(tcg_fpstatus);
tcg_temp_free_i32(tcg_rmode);
}