[PATCH 4/4] firewire: cdev: refactor event copying to remove goto statement
From: Takashi Sakamoto
Date: Sat Sep 26 2026 - 23:45:02 EST
Arrange the local variables to avoid a goto statement when copying events
to the userspace buffer.
Signed-off-by: Takashi Sakamoto <o-takashi@xxxxxxxxxxxxx>
---
drivers/firewire/core-cdev.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
index 73a940d40b39..e017086ff641 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)) {
+ 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;
- goto out;
+ break;
}
- total += size;
+ ret += size;
}
- ret = total;
- out:
kfree(event);
return ret;
--
2.53.0