Skip to content

Commit

Permalink
ubifs: Abort readdir upon error
Browse files Browse the repository at this point in the history
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.

Cc: stable@vger.kernel.org
Signed-off-by: Richard Weinberger <richard@nod.at>
  • Loading branch information
richardweinberger committed Oct 19, 2016
1 parent 884a3b6 commit c83ed4c
Showing 1 changed file with 3 additions and 5 deletions.
8 changes: 3 additions & 5 deletions fs/ubifs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,7 @@ static unsigned int vfs_dent_type(uint8_t type)
*/
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;
Expand Down Expand Up @@ -541,14 +541,12 @@ static int ubifs_readdir(struct file *file, struct dir_context *ctx)
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 */
Expand Down

0 comments on commit c83ed4c

Please sign in to comment.