diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2024-08-01 15:22:22 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2024-08-01 15:51:57 -0400 |
commit | 8aa37bde1a7b645816cda8b80df4753ecf172bf1 (patch) | |
tree | 08c6dcb66cde62378ba902286fc319fb8ad88dbf /fs | |
parent | 8400291e289ee6b2bf9779ff1c83a291501f017b (diff) |
protect the fetch of ->fd[fd] in do_dup2() from mispredictions
both callers have verified that fd is not greater than ->max_fds;
however, misprediction might end up with
tofree = fdt->fd[fd];
being speculatively executed. That's wrong for the same reasons
why it's wrong in close_fd()/file_close_fd_locked(); the same
solution applies - array_index_nospec(fd, fdt->max_fds) could differ
from fd only in case of speculative execution on mispredicted path.
Cc: stable@vger.kernel.org
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/file.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/file.c b/fs/file.c index a3b72aa64f11..a11e59b5d602 100644 --- a/fs/file.c +++ b/fs/file.c @@ -1248,6 +1248,7 @@ __releases(&files->file_lock) * tables and this condition does not arise without those. */ fdt = files_fdtable(files); + fd = array_index_nospec(fd, fdt->max_fds); tofree = fdt->fd[fd]; if (!tofree && fd_is_open(fd, fdt)) goto Ebusy; |