mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
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 <o-takashi@sakamocchi.jp>
This commit is contained in:
parent
9cc8efc586
commit
981a9c4feb
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user