On Thu, Jul 08, 2021 at 09:21:26AM +0200, Jan Beulich wrote: > Compilers are certainly right in detecting UB here, given that fully > parenthesized (to express precedence) the original offending expression > was (((stub_va + p) - ctxt->io_emul_stub) + 5), which in fact exhibits > two overflows in pointer calculations. We really want to calculate > (p - ctxt->io_emul_stub) first, which is guaranteed to not overflow. > > The issue was observed with clang 9 on 4.13. > > The oddities are > - the issue was detected on APPEND_CALL(save_guest_gprs), despite the > earlier similar APPEND_CALL(load_guest_gprs), > - merely casting the original offending expression to long was reported > to also help. > > While at it also avoid converting guaranteed (with our current address > space layout) negative values to unsigned long (which has implementation > defined behavior): Have stub_va be of pointer type. And since it's on an > immediately adjacent line, also constify this_stubs. > > Fixes: d89e5e65f305 ("x86/ioemul: Rewrite stub generation to be shadow stack > compatible") > Reported-by: Franklin Shen <2284696...@qq.com> > Signed-off-by: Jan Beulich <jbeul...@suse.com>
Acked-by: Roger Pau Monné <roger....@citrix.com> Thanks, Roger.