Hi Richard,

Yes you are right, thank you for catching that !

I'll publish a v2.

By the way, I hope I'm doing this the right way, it's the first time I
contribute to a project via email.

I'm more used to contribute through github/gitlab's PR/MR, if I am not
doing it properly feel free to let me know !

Regards,

Allan

Le ven. 22 mai 2026, 15:29, Richard GENOUD <[email protected]> a
écrit :

> Hi Allan,
> Le 14/05/2026 à 20:18, Allan ELKAIM a écrit :
> > sqfs_dir_offset() returns a negative errno on failure, but three
> > call sites in sqfs_search_dir() use the return value as an array
> > index without checking for errors first. If the lookup fails,
> > dirs->table is set to an invalid address, leading to undefined
> > behavior.
> >
> > Add negative-value guards after each sqfs_dir_offset() call so
> > that any lookup failure propagates cleanly as an error rather
> > than producing incorrect results.
> >
> > Note: the corresponding sqfs_find_inode() NULL checks and the
> > heap exhaustion fix during symlink resolution are applied in
> > separate patches.
> >
> > Signed-off-by: Allan ELKAIM <[email protected]>
> > ---
> >
> >   fs/squashfs/sqfs.c | 10 ++++++++++
> >   1 file changed, 10 insertions(+)
> >
> > diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c
> > index 07e2bd82..430e9bac 100644
> > --- a/fs/squashfs/sqfs.c
> > +++ b/fs/squashfs/sqfs.c
> > @@ -496,6 +496,8 @@ static int sqfs_search_dir(struct
> squashfs_dir_stream *dirs, char **token_list,
> >
> >       /* get directory offset in directory table */
> >       offset = sqfs_dir_offset(table, m_list, m_count);
> > +     if (offset < 0)
> > +             return offset;
> >       dirs->table = &dirs->dir_table[offset];
> >
> >       /* Setup directory header */
> > @@ -627,6 +629,10 @@ static int sqfs_search_dir(struct
> squashfs_dir_stream *dirs, char **token_list,
> >
> >               /* Get dir. offset into the directory table */
> >               offset = sqfs_dir_offset(table, m_list, m_count);
> > +             if (offset < 0) {
> > +                     ret = offset;
> > +                     goto out;
> > +             }
> Don't we need to:
>         free(dirs->entry);
>         dirs->entry = NULL;
> here?
>
> >               dirs->table = &dirs->dir_table[offset];
> >
> >               /* Copy directory header */
> > @@ -651,6 +657,10 @@ static int sqfs_search_dir(struct
> squashfs_dir_stream *dirs, char **token_list,
> >       }
> >
> >       offset = sqfs_dir_offset(table, m_list, m_count);
> > +     if (offset < 0) {
> > +             ret = offset;
> > +             goto out;
> > +     }
> same here?
>
> >       dirs->table = &dirs->dir_table[offset];
> >
> >       if (get_unaligned_le16(&dir->inode_type) == SQFS_DIR_TYPE)
>
> Thanks,
> Regards,
> Richard
>

Reply via email to