From 981a9c4feb7754815d84974fb1a14ba8cdcace57 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sun, 27 Sep 2026 12:43:43 +0900 Subject: [PATCH] firewire: cdev: refactor event copying to remove goto statement Arrange the local variables to avoid a goto statement when copying events to the userspace buffer. Link: https://lore.kernel.org/r/20260927034343.28076-5-o-takashi@sakamocchi.jp Signed-off-by: Takashi Sakamoto --- drivers/firewire/core-cdev.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c index 4e594b6029f4..a62df9034f4f 100644 --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c @@ -348,12 +348,9 @@ static void queue_event(struct client *client, struct event *event, } } -static int dequeue_event(struct client *client, - char __user *buffer, size_t count) +static ssize_t dequeue_event(struct client *client, char __user *buffer, size_t count) { struct event *event; - size_t size, total; - int i, ret; // After the following block, the event pointer above is guaranteed to have a correct value. { @@ -378,18 +375,17 @@ static int dequeue_event(struct client *client, spin_unlock_irq(&client->lock); } - total = 0; - for (i = 0; i < ARRAY_SIZE(event->v) && total < count; i++) { - size = min(event->v[i].size, count - total); - if (copy_to_user(buffer + total, event->v[i].data, size)) { - ret = -EFAULT; - goto out; - } - total += size; - } - ret = total; + ssize_t ret = 0; + + for (int i = 0; i < ARRAY_SIZE(event->v) && ret < count; i++) { + size_t size = min(event->v[i].size, count - ret); + if (copy_to_user(buffer + ret, event->v[i].data, size)) { + ret = -EFAULT; + break; + } + ret += size; + } - out: kfree(event); return ret;