diff options
author | Alex Bennée <alex.bennee@linaro.org> | 2019-05-30 15:35:14 +0100 |
---|---|---|
committer | Alex Bennée <alex.bennee@linaro.org> | 2019-06-12 17:53:22 +0100 |
commit | 78e24848f6a2923f356d15d8751c644f94a39fd8 (patch) | |
tree | f9a6d5636870a08f820e9186ade7738dd656487f /linux-user/arm | |
parent | 3ace9be6d267b2f876ebb34096fe5d9b64a82d9a (diff) | |
download | qemu-78e24848f6a2923f356d15d8751c644f94a39fd8.zip qemu-78e24848f6a2923f356d15d8751c644f94a39fd8.tar.gz qemu-78e24848f6a2923f356d15d8751c644f94a39fd8.tar.bz2 |
semihosting: split console_out into string and char versions
This is ostensibly to avoid the weirdness of len looking like it might
come from a guest and sometimes being used. While we are at it fix up
the error checking for the arm-linux-user implementation of the API
which got flagged up by Coverity (CID 1401700).
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Diffstat (limited to 'linux-user/arm')
-rw-r--r-- | linux-user/arm/semihost.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/linux-user/arm/semihost.c b/linux-user/arm/semihost.c index 9554102..a16b525 100644 --- a/linux-user/arm/semihost.c +++ b/linux-user/arm/semihost.c @@ -15,10 +15,35 @@ #include "hw/semihosting/console.h" #include "qemu.h" -int qemu_semihosting_console_out(CPUArchState *env, target_ulong addr, int len) +int qemu_semihosting_console_outs(CPUArchState *env, target_ulong addr) { - void *s = lock_user_string(addr); - len = write(STDERR_FILENO, s, len ? len : strlen(s)); + int len = target_strlen(addr); + void *s; + if (len < 0){ + qemu_log_mask(LOG_GUEST_ERROR, + "%s: passed inaccessible address " TARGET_FMT_lx, + __func__, addr); + return 0; + } + s = lock_user(VERIFY_READ, addr, (long)(len + 1), 1); + g_assert(s); /* target_strlen has already verified this will work */ + len = write(STDERR_FILENO, s, len); unlock_user(s, addr, 0); return len; } + +void qemu_semihosting_console_outc(CPUArchState *env, target_ulong addr) +{ + char c; + + if (get_user_u8(c, addr)) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: passed inaccessible address " TARGET_FMT_lx, + __func__, addr); + } else { + if (write(STDERR_FILENO, &c, 1) != 1) { + qemu_log_mask(LOG_UNIMP, "%s: unexpected write to stdout failure", + __func__); + } + } +} |