[PATCH v2 2/4] fs: cramfs: return an error pointer from cramfs_get_link()
Sascha Hauer
s.hauer at pengutronix.de
Mon Nov 2 01:31:21 PST 2026
cramfs_get_link() checks the result of cramfs_read_file() for a negative
value, which it never returns: when a block fails to decompress, it
stops and returns how much it has copied so far. A link that can't be
read is therefore returned as if it could, with its unread part zeroed,
and stays cached in inode->i_link.
Treat a short read as -EIO, drop the buffer and return an error pointer.
Not NULL, which the check would have returned: readlinkat() checks the
link only with IS_ERR() before copying from it, and path lookup takes
NULL to mean that the link has already been followed.
Fixes: 0a5e0f40f9 ("fs: cramfs: Switch to dentry cache implementation")
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
fs/cramfs/cramfs.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/fs/cramfs/cramfs.c b/fs/cramfs/cramfs.c
index fcb9aeeab8..b41c852758 100644
--- a/fs/cramfs/cramfs.c
+++ b/fs/cramfs/cramfs.c
@@ -432,8 +432,11 @@ static const char *cramfs_get_link(struct dentry *dentry, struct inode *inode)
inode->i_link = xzalloc(size_add(inode->i_size, 1));
ret = cramfs_read_file(inode, 0, inode->i_link, inode->i_size);
- if (ret < 0)
- return NULL;
+ if (ret != inode->i_size) {
+ free(inode->i_link);
+ inode->i_link = NULL;
+ return ERR_PTR(-EIO);
+ }
return inode->i_link;
}
--
2.47.3
More information about the barebox
mailing list