From: Al Viro Date: Fri, 30 Nov 2012 03:57:33 +0000 (-0500) Subject: fix off-by-one in argument passed by iterate_fd() to callbacks X-Git-Tag: v3.7-rc8~10^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a77cfcb429ed98845a4e4df72473b8f37acd890b;p=profile%2Fcommon%2Fkernel-common.git fix off-by-one in argument passed by iterate_fd() to callbacks Noticed by Pavel Roskin; the thing in his patch I disagree with was compensating for that shite in callbacks instead of fixing it once in the iterator itself. Signed-off-by: Al Viro --- diff --git a/fs/file.c b/fs/file.c index 7cb71b9..eff2316 100644 --- a/fs/file.c +++ b/fs/file.c @@ -994,16 +994,18 @@ int iterate_fd(struct files_struct *files, unsigned n, const void *p) { struct fdtable *fdt; - struct file *file; int res = 0; if (!files) return 0; spin_lock(&files->file_lock); - fdt = files_fdtable(files); - while (!res && n < fdt->max_fds) { - file = rcu_dereference_check_fdtable(files, fdt->fd[n++]); - if (file) - res = f(p, file, n); + for (fdt = files_fdtable(files); n < fdt->max_fds; n++) { + struct file *file; + file = rcu_dereference_check_fdtable(files, fdt->fd[n]); + if (!file) + continue; + res = f(p, file, n); + if (res) + break; } spin_unlock(&files->file_lock); return res;