Message ID | 1491414813-30003-3-git-send-email-andrew.cooper3@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
>>> On 05.04.17 at 19:53, <andrew.cooper3@citrix.com> wrote: > For control-flow changes, the emulator needs to perform a zero-length > instruction fetch at the target offset. It also passes NULL for the > destination buffer, as there is no instruction stream to collect. > > This trips up UBSAN when passed to memcpy(), as passing NULL is undefined > behaviour per the C spec (irrespective of passing a size of 0). > > Special case these fetches in fuzz_insn_fetch() before reaching data_read(). > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> > Acked-by: George Dunlap <george.dunlap@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
diff --git a/tools/fuzz/x86_instruction_emulator/fuzz-emul.c b/tools/fuzz/x86_instruction_emulator/fuzz-emul.c index 65c5a3b..64b7fb2 100644 --- a/tools/fuzz/x86_instruction_emulator/fuzz-emul.c +++ b/tools/fuzz/x86_instruction_emulator/fuzz-emul.c @@ -117,6 +117,16 @@ static int fuzz_insn_fetch( unsigned int bytes, struct x86_emulate_ctxt *ctxt) { + /* + * Zero-length instruction fetches are made at the destination of jumps, + * to perform segmentation checks. No data needs returning. + */ + if ( bytes == 0 ) + { + assert(p_data == NULL); + return maybe_fail("insn_fetch", true); + } + return data_read("insn_fetch", p_data, bytes); }