+++ /dev/null
-From c83ed4c9dbb358b9e7707486e167e940d48bfeed Mon Sep 17 00:00:00 2001
-From: Richard Weinberger <richard@nod.at>
-Date: Wed, 19 Oct 2016 12:43:07 +0200
-Subject: ubifs: Abort readdir upon error
-
-From: Richard Weinberger <richard@nod.at>
-
-commit c83ed4c9dbb358b9e7707486e167e940d48bfeed upstream.
-
-If UBIFS is facing an error while walking a directory, it reports this
-error and ubifs_readdir() returns the error code. But the VFS readdir
-logic does not make the getdents system call fail in all cases. When the
-readdir cursor indicates that more entries are present, the system call
-will just return and the libc wrapper will try again since it also
-knows that more entries are present.
-This causes the libc wrapper to busy loop for ever when a directory is
-corrupted on UBIFS.
-A common approach do deal with corrupted directory entries is
-skipping them by setting the cursor to the next entry. On UBIFS this
-approach is not possible since we cannot compute the next directory
-entry cursor position without reading the current entry. So all we can
-do is setting the cursor to the "no more entries" position and make
-getdents exit.
-
-Signed-off-by: Richard Weinberger <richard@nod.at>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- fs/ubifs/dir.c | 8 +++-----
- 1 file changed, 3 insertions(+), 5 deletions(-)
-
---- a/fs/ubifs/dir.c
-+++ b/fs/ubifs/dir.c
-@@ -350,7 +350,7 @@ static unsigned int vfs_dent_type(uint8_
- */
- static int ubifs_readdir(struct file *file, struct dir_context *ctx)
- {
-- int err;
-+ int err = 0;
- struct qstr nm;
- union ubifs_key key;
- struct ubifs_dent_node *dent;
-@@ -452,14 +452,12 @@ out:
- kfree(file->private_data);
- file->private_data = NULL;
-
-- if (err != -ENOENT) {
-+ if (err != -ENOENT)
- ubifs_err(c, "cannot find next direntry, error %d", err);
-- return err;
-- }
-
- /* 2 is a special value indicating that there are no more direntries */
- ctx->pos = 2;
-- return 0;
-+ return err;
- }
-
- /* Free saved readdir() state when the directory is closed */