diff options
| author | Tony Lindgren <tony@atomide.com> | 2021-02-15 06:41:56 +0200 |
|---|---|---|
| committer | Tony Lindgren <tony@atomide.com> | 2021-02-15 06:41:56 +0200 |
| commit | 857de6fe2f86b009df620f7cdb07c262cc17070d (patch) | |
| tree | e9718ebeeef39485a51a9f8e3c8122da18c796cf /fs/select.c | |
| parent | ARM: dts: am33xx: add aliases for mmc interfaces (diff) | |
| parent | ARM: OMAP2+: Fix smartreflex init regression after dropping legacy data (diff) | |
| download | linux-857de6fe2f86b009df620f7cdb07c262cc17070d.tar.gz linux-857de6fe2f86b009df620f7cdb07c262cc17070d.zip | |
Merge branch 'fixes-v5.11' into fixes
Diffstat (limited to 'fs/select.c')
| -rw-r--r-- | fs/select.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/select.c b/fs/select.c index ebfebdfe5c69..37aaa8317f3a 100644 --- a/fs/select.c +++ b/fs/select.c @@ -1011,14 +1011,17 @@ static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, fdcount = do_poll(head, &table, end_time); poll_freewait(&table); + if (!user_write_access_begin(ufds, nfds * sizeof(*ufds))) + goto out_fds; + for (walk = head; walk; walk = walk->next) { struct pollfd *fds = walk->entries; int j; - for (j = 0; j < walk->len; j++, ufds++) - if (__put_user(fds[j].revents, &ufds->revents)) - goto out_fds; + for (j = walk->len; j; fds++, ufds++, j--) + unsafe_put_user(fds->revents, &ufds->revents, Efault); } + user_write_access_end(); err = fdcount; out_fds: @@ -1030,6 +1033,11 @@ out_fds: } return err; + +Efault: + user_write_access_end(); + err = -EFAULT; + goto out_fds; } static long do_restart_poll(struct restart_block *restart_block) |
