udf: Propagate errors from udf_advance_blk()
authorJan Kara <jack@suse.cz>
Wed, 25 Jan 2023 10:46:19 +0000 (11:46 +0100)
committerJan Kara <jack@suse.cz>
Thu, 26 Jan 2023 15:46:32 +0000 (16:46 +0100)
When we spot directory corruption when trying to load next directory
extent, we didn't propagate the error up properly, leading to possibly
indefinite looping on corrupted directories. Fix the problem by
propagating the error properly.

Signed-off-by: Jan Kara <jack@suse.cz>
fs/udf/directory.c

index e8cf13214c8c54361f18bdd7b6bbce4249a4b624..b1424e2aa86829578609aa1d70675abe96744391 100644 (file)
@@ -217,7 +217,9 @@ static int udf_fiiter_load_bhs(struct udf_fileident_iter *iter)
        /* Need to fetch next block to get name? */
        if (off + udf_dir_entry_len(fi) > blksize) {
 fetch_next:
-               udf_fiiter_advance_blk(iter);
+               err = udf_fiiter_advance_blk(iter);
+               if (err)
+                       goto out_brelse;
                iter->bh[1] = udf_fiiter_bread_blk(iter);
                if (!iter->bh[1]) {
                        err = -ENOMEM;
@@ -296,7 +298,9 @@ int udf_fiiter_advance(struct udf_fileident_iter *iter)
                                iter->bh[0] = iter->bh[1];
                                iter->bh[1] = NULL;
                        } else {
-                               udf_fiiter_advance_blk(iter);
+                               err = udf_fiiter_advance_blk(iter);
+                               if (err < 0)
+                                       return err;
                        }
                }
                err = udf_fiiter_load_bhs(iter);