[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] libqtest: handle zero length memwrite/memread
From: |
John Snow |
Subject: |
Re: [Qemu-devel] [PATCH] libqtest: handle zero length memwrite/memread |
Date: |
Wed, 11 Jan 2017 14:34:06 -0500 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 |
On 01/11/2017 03:49 AM, Greg Kurz wrote:
> Some recently added tests pass a zero length to qtest_memwrite().
> Unfortunately, the qtest protocol doesn't implement an on-the-wire
> syntax for zero-length writes and the current code happily sends
> garbage to QEMU. This causes intermittent failures.
>
> It isn't worth the pain to enhance the protocol, so this patch
> simply fixes the issue by "just return, doing nothing". The same
> fix is applied to qtest_memread() since the issue also exists in
> the QEMU part of the "memread" command.
>
> Suggested-by: Peter Maydell <address@hidden>
> Signed-off-by: Greg Kurz <address@hidden>
> ---
> qtest.c | 2 ++
> tests/libqtest.c | 12 +++++++++++-
> 2 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/qtest.c b/qtest.c
> index 46b99aed5291..bd9d4178129b 100644
> --- a/qtest.c
> +++ b/qtest.c
> @@ -430,6 +430,8 @@ static void qtest_process_command(CharBackend *chr, gchar
> **words)
> g_assert(words[1] && words[2]);
> g_assert(qemu_strtoull(words[1], NULL, 0, &addr) == 0);
> g_assert(qemu_strtoull(words[2], NULL, 0, &len) == 0);
> + /* We'd send garbage to libqtest if len is 0 */
> + g_assert(len);
>
> data = g_malloc(len);
> cpu_physical_memory_read(addr, data, len);
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 6f6975248fae..d8fba6647a17 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -768,6 +768,10 @@ void qtest_memread(QTestState *s, uint64_t addr, void
> *data, size_t size)
> gchar **args;
> size_t i;
>
> + if (!size) {
> + return;
> + }
> +
> qtest_sendf(s, "read 0x%" PRIx64 " 0x%zx\n", addr, size);
> args = qtest_rsp(s, 2);
>
> @@ -858,7 +862,13 @@ void qtest_memwrite(QTestState *s, uint64_t addr, const
> void *data, size_t size)
> {
> const uint8_t *ptr = data;
> size_t i;
> - char *enc = g_malloc(2 * size + 1);
> + char *enc;
> +
> + if (!size) {
> + return;
> + }
> +
> + enc = g_malloc(2 * size + 1);
>
> for (i = 0; i < size; i++) {
> sprintf(&enc[i * 2], "%02x", ptr[i]);
>
>
Reviewed-by: John Snow <address@hidden>