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:
|
||
|---|---|---|
| .. | ||
| copy_up.c | ||
| dir.c | ||
| export.c | ||
| file.c | ||
| inode.c | ||
| Kconfig | ||
| Makefile | ||
| namei.c | ||
| overlayfs.h | ||
| ovl_entry.h | ||
| params.c | ||
| params.h | ||
| readdir.c | ||
| super.c | ||
| util.c | ||
| xattrs.c | ||