[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 31/60] semihosting: Bound length for semihost_sys_{read,write}
From: |
Richard Henderson |
Subject: |
[PULL 31/60] semihosting: Bound length for semihost_sys_{read,write} |
Date: |
Tue, 28 Jun 2022 10:23:34 +0530 |
Fixes a minor bug in which a 64-bit guest on a 32-bit host could
truncate the length. This would only ever cause a problem if
there were no bits set in the low 32, so that it truncates to 0.
Reviewed-by: Luc Michel <lmichel@kalray.eu>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
semihosting/syscalls.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/semihosting/syscalls.c b/semihosting/syscalls.c
index 5cb12d6adc..eefbae74f1 100644
--- a/semihosting/syscalls.c
+++ b/semihosting/syscalls.c
@@ -283,6 +283,14 @@ void semihost_sys_close(CPUState *cs,
gdb_syscall_complete_cb complete, int fd)
void semihost_sys_read_gf(CPUState *cs, gdb_syscall_complete_cb complete,
GuestFD *gf, target_ulong buf, target_ulong len)
{
+ /*
+ * Bound length for 64-bit guests on 32-bit hosts, not overlowing ssize_t.
+ * Note the Linux kernel does this with MAX_RW_COUNT, so it's not a bad
+ * idea to do this unconditionally.
+ */
+ if (len > INT32_MAX) {
+ len = INT32_MAX;
+ }
switch (gf->type) {
case GuestFDGDB:
gdb_read(cs, complete, gf, buf, len);
@@ -313,6 +321,14 @@ void semihost_sys_read(CPUState *cs,
gdb_syscall_complete_cb complete,
void semihost_sys_write_gf(CPUState *cs, gdb_syscall_complete_cb complete,
GuestFD *gf, target_ulong buf, target_ulong len)
{
+ /*
+ * Bound length for 64-bit guests on 32-bit hosts, not overlowing ssize_t.
+ * Note the Linux kernel does this with MAX_RW_COUNT, so it's not a bad
+ * idea to do this unconditionally.
+ */
+ if (len > INT32_MAX) {
+ len = INT32_MAX;
+ }
switch (gf->type) {
case GuestFDGDB:
gdb_write(cs, complete, gf, buf, len);
--
2.34.1
- [PULL 24/60] semihosting: Split out common-semi-target.h, (continued)
- [PULL 24/60] semihosting: Split out common-semi-target.h, Richard Henderson, 2022/06/28
- [PULL 26/60] semihosting: Move GET_ARG/SET_ARG earlier in the file, Richard Henderson, 2022/06/28
- [PULL 25/60] semihosting: Use env more often in do_common_semihosting, Richard Henderson, 2022/06/28
- [PULL 29/60] semihosting: Split out semihost_sys_read, Richard Henderson, 2022/06/28
- [PULL 21/60] semihosting: Split is_64bit_semihosting per target, Richard Henderson, 2022/06/28
- [PULL 32/60] semihosting: Split out semihost_sys_lseek, Richard Henderson, 2022/06/28
- [PULL 33/60] semihosting: Split out semihost_sys_isatty, Richard Henderson, 2022/06/28
- [PULL 28/60] semihosting: Split out semihost_sys_close, Richard Henderson, 2022/06/28
- [PULL 23/60] semihosting: Split out common_semi_has_synccache, Richard Henderson, 2022/06/28
- [PULL 30/60] semihosting: Split out semihost_sys_write, Richard Henderson, 2022/06/28
- [PULL 31/60] semihosting: Bound length for semihost_sys_{read,write},
Richard Henderson <=
- [PULL 27/60] semihosting: Split out semihost_sys_open, Richard Henderson, 2022/06/28
- [PULL 35/60] semihosting: Split out semihost_sys_remove, Richard Henderson, 2022/06/28
- [PULL 34/60] semihosting: Split out semihost_sys_flen, Richard Henderson, 2022/06/28
- [PULL 36/60] semihosting: Split out semihost_sys_rename, Richard Henderson, 2022/06/28
- [PULL 37/60] semihosting: Split out semihost_sys_system, Richard Henderson, 2022/06/28
- [PULL 38/60] semihosting: Create semihost_sys_{stat,fstat}, Richard Henderson, 2022/06/28
- [PULL 39/60] semihosting: Create semihost_sys_gettimeofday, Richard Henderson, 2022/06/28
- [PULL 40/60] gdbstub: Adjust gdb_syscall_complete_cb declaration, Richard Henderson, 2022/06/28
- [PULL 41/60] semihosting: Fix docs comment for qemu_semihosting_console_inc, Richard Henderson, 2022/06/28
- [PULL 42/60] semihosting: Pass CPUState to qemu_semihosting_console_inc, Richard Henderson, 2022/06/28