fs/qnx6: fix pointer arithmetic in directory iteration
The conversion to qnx6_get_folio() in commitb2aa61556f("qnx6: Convert qnx6_get_page() to qnx6_get_folio()") introduced a regression in directory iteration. The pointer 'de' and the 'limit' address were calculated using byte offsets from a char pointer without scaling by the size of a QNX6 directory entry. This causes the driver to read from incorrect memory offsets, leading to "invalid direntry size" errors and premature termination of directory scans. Fix this by casting 'kaddr' to 'struct qnx6_dir_entry *' before applying the offset and last_entry(...) increments. This allows the compiler to correctly scale the pointer arithmetic by the 32-byte stride of the directory entry structure. Fixes:b2aa61556f("qnx6: Convert qnx6_get_page() to qnx6_get_folio()") Cc: stable@vger.kernel.org Signed-off-by: Arpith Kalaginanavoor <arpithk@nvidia.com> Link: https://patch.msgid.link/20260526123858.1683035-1-arpithk@nvidia.com Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
This commit is contained in:
parent
e824bbd4d2
commit
89c4a1167f
1 changed files with 4 additions and 4 deletions
|
|
@ -132,16 +132,16 @@ static int qnx6_readdir(struct file *file, struct dir_context *ctx)
|
|||
struct qnx6_dir_entry *de;
|
||||
struct folio *folio;
|
||||
char *kaddr = qnx6_get_folio(inode, n, &folio);
|
||||
char *limit;
|
||||
struct qnx6_dir_entry *limit;
|
||||
|
||||
if (IS_ERR(kaddr)) {
|
||||
pr_err("%s(): read failed\n", __func__);
|
||||
ctx->pos = (n + 1) << PAGE_SHIFT;
|
||||
return PTR_ERR(kaddr);
|
||||
}
|
||||
de = (struct qnx6_dir_entry *)(kaddr + offset);
|
||||
limit = kaddr + last_entry(inode, n);
|
||||
for (; (char *)de < limit; de++, ctx->pos += QNX6_DIR_ENTRY_SIZE) {
|
||||
de = (struct qnx6_dir_entry *)kaddr + offset;
|
||||
limit = (struct qnx6_dir_entry *)kaddr + last_entry(inode, n);
|
||||
for (; de < limit; de++, ctx->pos += QNX6_DIR_ENTRY_SIZE) {
|
||||
int size = de->de_size;
|
||||
u32 no_inode = fs32_to_cpu(sbi, de->de_inode);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue