Richard Henderson <richard.hender...@linaro.org> writes:
> Do not read from the gdb struct stat buffer if the callback is > reporting an error. Use common_semi_cb to finish returning results. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > semihosting/arm-compat-semi.c | 20 +++++++++++--------- > 1 file changed, 11 insertions(+), 9 deletions(-) > > diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c > index 88e1c286ba..8792180974 100644 > --- a/semihosting/arm-compat-semi.c > +++ b/semihosting/arm-compat-semi.c > @@ -346,15 +346,17 @@ static target_ulong common_semi_flen_buf(CPUState *cs) > static void > common_semi_flen_cb(CPUState *cs, target_ulong ret, target_ulong err) > { > - /* The size is always stored in big-endian order, extract > - the value. We assume the size always fit in 32 bits. */ > - uint32_t size; > - cpu_memory_rw_debug(cs, common_semi_flen_buf(cs) + 32, > - (uint8_t *)&size, 4, 0); > - size = be32_to_cpu(size); > - common_semi_set_ret(cs, size); > - errno = err; > - set_swi_errno(cs, -1); > + if (!err) { > + /* > + * The size is always stored in big-endian order, extract > + * the value. We assume the size always fit in 32 bits. > + */ > + uint32_t size; > + cpu_memory_rw_debug(cs, common_semi_flen_buf(cs) + 32, > + (uint8_t *)&size, 4, 0); I did a double take but compared to the actual code it calls I guess its fine. Technically I think: cpu_memory_rw_debug(cs, common_semi_flen_buf(cs) + 32, (void *) &size, sizeof(size), 0); might be slightly cleaner but whatever: Reviewed-by: Alex Bennée <alex.ben...@linaro.org> > + ret = be32_to_cpu(size); > + } > + common_semi_cb(cs, ret, err); > } > > static int common_semi_open_guestfd; -- Alex Bennée