From 59cc98aa2fa8f7e1713c90a534b37970fa526164 Mon Sep 17 00:00:00 2001 From: John Levon Date: Tue, 13 Apr 2021 10:46:43 +0100 Subject: irq.c: use ERROR_INT() (#429) Signed-off-by: John Levon Reviewed-by: Thanos Makatos --- lib/irq.c | 16 ++++++++-------- lib/libvfio-user.c | 4 ++++ test/unit-tests.c | 45 ++++++++++++++++++++++++++++++--------------- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/lib/irq.c b/lib/irq.c index 1dec459..3547df5 100644 --- a/lib/irq.c +++ b/lib/irq.c @@ -55,7 +55,7 @@ vfio_irq_idx_to_str(int index) } } -static long +static int dev_get_irqinfo(vfu_ctx_t *vfu_ctx, struct vfio_irq_info *irq_info_in, struct vfio_irq_info *irq_info_out) { @@ -68,7 +68,7 @@ dev_get_irqinfo(vfu_ctx_t *vfu_ctx, struct vfio_irq_info *irq_info_in, (irq_info_in->index >= VFU_DEV_NUM_IRQS)) { vfu_log(vfu_ctx, LOG_DEBUG, "bad irq_info (size=%d index=%d)", irq_info_in->argsz, irq_info_in->index); - return -EINVAL; + return ERROR_INT(EINVAL); } irq_info_out->count = vfu_ctx->irq_count[irq_info_in->index]; @@ -88,7 +88,7 @@ handle_device_get_irq_info(vfu_ctx_t *vfu_ctx, uint32_t size, if (size != sizeof(*irq_info_in) || size != irq_info_in->argsz) { vfu_log(vfu_ctx, LOG_WARNING, "IRQ info size %d", size); - return -EINVAL; + return ERROR_INT(EINVAL); } return dev_get_irqinfo(vfu_ctx, irq_info_in, irq_info_out); @@ -174,7 +174,7 @@ irqs_set_data_none(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set) if (ret == -1) { vfu_log(vfu_ctx, LOG_DEBUG, "IRQ: failed to set data to none: %m"); - return -errno; + return -1; } } } @@ -201,7 +201,7 @@ irqs_set_data_bool(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set, void *data) if (ret == -1) { vfu_log(vfu_ctx, LOG_DEBUG, "IRQ: failed to set data to bool: %m"); - return -errno; + return -1; } } } @@ -240,7 +240,7 @@ irqs_set_data_eventfd(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set, return 0; } -static long +static int device_set_irqs_validate(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set, size_t nr_fds) { @@ -315,7 +315,7 @@ invalid: vfu_log(vfu_ctx, LOG_DEBUG, "invalid SET_IRQS (%d): action=%u data_type=%u " "index=%u start=%u count=%u nr_fds=%zu", line, a_type, d_type, irq_set->index, irq_set->start, irq_set->count, nr_fds); - return -EINVAL; + return ERROR_INT(EINVAL); } int @@ -330,7 +330,7 @@ handle_device_set_irqs(vfu_ctx_t *vfu_ctx, uint32_t size, if (size < sizeof(*irq_set) || size != irq_set->argsz) { vfu_log(vfu_ctx, LOG_ERR, "%s: bad size %u", __func__, size); - return -EINVAL; + return ERROR_INT(EINVAL); } ret = device_set_irqs_validate(vfu_ctx, irq_set, nr_fds); diff --git a/lib/libvfio-user.c b/lib/libvfio-user.c index f4aa804..b0bfbbe 100644 --- a/lib/libvfio-user.c +++ b/lib/libvfio-user.c @@ -856,6 +856,7 @@ MOCK_DEFINE(exec_command)(vfu_ctx_t *vfu_ctx, struct vfio_user_header *hdr, *iovecs = _iovecs; *nr_iovecs = 2; } else { + ret = -errno; free(irq_info); } break; @@ -863,6 +864,9 @@ MOCK_DEFINE(exec_command)(vfu_ctx_t *vfu_ctx, struct vfio_user_header *hdr, case VFIO_USER_DEVICE_SET_IRQS: ret = handle_device_set_irqs(vfu_ctx, cmd_data_size, fds, nr_fds, cmd_data); + if (ret < 0) { + ret = -errno; + } break; case VFIO_USER_REGION_READ: diff --git a/test/unit-tests.c b/test/unit-tests.c index 1e245a5..4a628a0 100644 --- a/test/unit-tests.c +++ b/test/unit-tests.c @@ -1746,34 +1746,39 @@ test_device_set_irqs(UNUSED void **state) ret = handle_device_set_irqs(&vfu_ctx, 0, NULL, 0, &irq_set); /* bad message size */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.argsz = 3; ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad .argsz */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.argsz = sizeof (irq_set); irq_set.index = VFU_DEV_NUM_IRQS; ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad .index */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.index = VFU_DEV_MSIX_IRQ; irq_set.flags = VFIO_IRQ_SET_ACTION_MASK | VFIO_IRQ_SET_ACTION_UNMASK; ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad flags, MASK and UNMASK */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.flags = VFIO_IRQ_SET_ACTION_MASK | VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_DATA_BOOL; ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad flags, DATA_NONE and DATA_BOOL */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.flags = VFIO_IRQ_SET_ACTION_MASK | VFIO_IRQ_SET_DATA_NONE; irq_set.start = 2047; @@ -1781,14 +1786,16 @@ test_device_set_irqs(UNUSED void **state) ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad start, count range */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.start = 2049; irq_set.count = 1; ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad start, count range */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.start = 0; irq_set.count = 1; @@ -1796,13 +1803,15 @@ test_device_set_irqs(UNUSED void **state) ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad action for err irq */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.index = VFU_DEV_REQ_IRQ; ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad action for req irq */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.start = 1; irq_set.count = 0; @@ -1810,7 +1819,8 @@ test_device_set_irqs(UNUSED void **state) ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad start for count == 0 */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.flags = VFIO_IRQ_SET_ACTION_MASK | VFIO_IRQ_SET_DATA_NONE; irq_set.count = 0; @@ -1818,7 +1828,8 @@ test_device_set_irqs(UNUSED void **state) ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad action for count == 0 */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.flags = VFIO_IRQ_SET_ACTION_TRIGGER | VFIO_IRQ_SET_DATA_BOOL; irq_set.count = 0; @@ -1826,7 +1837,8 @@ test_device_set_irqs(UNUSED void **state) ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set); /* bad action and data type for count == 0 */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.flags = VFIO_IRQ_SET_ACTION_TRIGGER | VFIO_IRQ_SET_DATA_BOOL; irq_set.count = 1; @@ -1834,7 +1846,8 @@ test_device_set_irqs(UNUSED void **state) ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), &fd, 1, &irq_set); /* bad fds for DATA_BOOL */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.flags = VFIO_IRQ_SET_ACTION_TRIGGER | VFIO_IRQ_SET_DATA_NONE; irq_set.count = 1; @@ -1842,7 +1855,8 @@ test_device_set_irqs(UNUSED void **state) ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), &fd, 1, &irq_set); /* bad fds for DATA_NONE */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irq_set.flags = VFIO_IRQ_SET_ACTION_TRIGGER | VFIO_IRQ_SET_DATA_EVENTFD; irq_set.count = 2; @@ -1850,7 +1864,8 @@ test_device_set_irqs(UNUSED void **state) ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), &fd, 1, &irq_set); /* bad fds for count == 2 */ - assert_int_equal(-EINVAL, ret); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); irqs->err_efd = irqs->req_efd = -1; -- cgit v1.1