Skip to content

Commit b496691

Browse files
nirmoynvidia-bfigg
authored andcommitted
NVIDIA: SAUCE: ovl: keep err zero after successful ovl_cache_get()
BugLink: https://bugs.launchpad.net/bugs/2150640 ovl_iterate_merged() stores PTR_ERR(cache) in err before checking IS_ERR(cache). On success err holds the truncated cache pointer and can be returned as a bogus non-zero error. The syzbot reproducer reaches this through overlay-on-overlay readdir: getdents64 iterate_dir(outer overlay file) ovl_iterate_merged() ovl_cache_get() ovl_dir_read_merged() ovl_dir_read() iterate_dir(inner overlay file) ovl_iterate_merged() Only compute PTR_ERR(cache) on the error path. Fixes: d25e4b7 ("ovl: refactor ovl_iterate() and port to cred guard") Reported-by: syzbot+a16fb0cce329a320661c@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=a16fb0cce329a320661c Cc: stable@vger.kernel.org Signed-off-by: Nirmoy Das <nirmoyd@nvidia.com> Acked-by: Jamie Nguyen <jamien@nvidia.com> Acked-by: Matthew R. Ochs <mochs@nvidia.com> Acked-by: Carol L Soto <csoto@nvidia.com> (backported from https://lore.kernel.org/r/20260514144258.3068715-1-nirmoyd@nvidia.com) Signed-off-by: Brad Figg <bfigg@nvidia.com>
1 parent f8bb555 commit b496691

1 file changed

Lines changed: 3 additions & 4 deletions

File tree

fs/overlayfs/readdir.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -838,15 +838,14 @@ static int ovl_iterate_merged(struct file *file, struct dir_context *ctx)
838838
struct ovl_dir_file *od = file->private_data;
839839
struct dentry *dentry = file->f_path.dentry;
840840
struct ovl_cache_entry *p;
841-
int err = 0;
841+
int err;
842842

843843
if (!od->cache) {
844844
struct ovl_dir_cache *cache;
845845

846846
cache = ovl_cache_get(dentry);
847-
err = PTR_ERR(cache);
848847
if (IS_ERR(cache))
849-
return err;
848+
return PTR_ERR(cache);
850849

851850
od->cache = cache;
852851
ovl_seek_cursor(od, ctx->pos);
@@ -869,7 +868,7 @@ static int ovl_iterate_merged(struct file *file, struct dir_context *ctx)
869868
od->cursor = p->l_node.next;
870869
ctx->pos++;
871870
}
872-
return err;
871+
return 0;
873872
}
874873

875874
static bool ovl_need_adjust_d_ino(struct file *file)

0 commit comments

Comments
 (0)