Only 20 bytes are written to the passed buffer and the returned string doesn't have a NUL terminator.
Signed-off-by: Kevin Wolf <[email protected]> --- tests/qtest/virtio-blk-test.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/qtest/virtio-blk-test.c b/tests/qtest/virtio-blk-test.c index 14fadcb4009..99d785d9e1a 100644 --- a/tests/qtest/virtio-blk-test.c +++ b/tests/qtest/virtio-blk-test.c @@ -835,6 +835,25 @@ static void get_id_serial_short(void *obj, void *data, QGuestAllocator *t_alloc) qvirtqueue_cleanup(blk_if->vdev->bus, vq, t_alloc); } +static void get_id_serial_short_trunc(void *obj, void *data, + QGuestAllocator *t_alloc) +{ + QVirtioBlk *blk_if = obj; + QVirtioDevice *dev = blk_if->vdev; + QVirtQueue *vq; + uint8_t status; + /* Everything after the 20 character maximum is untouched, no '\0' */ + const char expected[25] = "01234567890123456789\xa5\xa5\xa5\xa5\xa5"; + char buf[25]; + + vq = get_id_setup(dev, t_alloc); + status = get_id_request(dev, vq, buf, 25, t_alloc); + g_assert_cmpint(status, ==, 0); + g_assert_cmpmem(buf, 25, expected, sizeof(expected)); + + qvirtqueue_cleanup(blk_if->vdev->bus, vq, t_alloc); +} + static void *virtio_blk_test_setup(GString *cmd_line, void *arg) { char *tmp_path = drive_create(); @@ -871,6 +890,10 @@ static void register_virtio_blk_test(void) opts.edge.extra_device_opts = "serial=abc"; qos_add_test("get_id/serial_short", "virtio-blk", get_id_serial_short, &opts); + + opts.edge.extra_device_opts = "serial=012345678901234567890123456789"; + qos_add_test("get_id/serial_short_trunc", "virtio-blk", + get_id_serial_short_trunc, &opts); } libqos_init(register_virtio_blk_test); -- 2.56.0
