From: Eric Biggers <ebiggers@kernel.org>
To: Theodore Ts'o <tytso@mit.edu>
Cc: Jan Kara <jack@suse.cz>,
linux-ext4@vger.kernel.org,
syzbot+48a99e426f29859818c0@syzkaller.appspotmail.com,
"Darrick J. Wong" <djwong@kernel.org>
Subject: Re: [PATCH] ext4: Verify fast symlink length
Date: Thu, 6 Feb 2025 08:04:53 -0800 [thread overview]
Message-ID: <20250206160453.GA4283@sol.localdomain> (raw)
In-Reply-To: <20250206152419.GB1130956@mit.edu>
On Thu, Feb 06, 2025 at 10:24:19AM -0500, Theodore Ts'o wrote:
> On Thu, Feb 06, 2025 at 10:44:55AM +0100, Jan Kara wrote:
> > Verify fast symlink length stored in inode->i_size matches the string
> > stored in the inode to avoid surprises from corrupted filesystems.
> >
> > Reported-by: syzbot+48a99e426f29859818c0@syzkaller.appspotmail.com
> > Tested-by: syzbot+48a99e426f29859818c0@syzkaller.appspotmail.com
> > Fixes: bae80473f7b0 ("ext4: use inode_set_cached_link()")
> > Suggested-by: "Darrick J. Wong" <djwong@kernel.org>
> > Signed-off-by: Jan Kara <jack@suse.cz>
> > ---
> > fs/ext4/inode.c | 12 ++++++++++--
> > 1 file changed, 10 insertions(+), 2 deletions(-)
> >
> > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> > index 7c54ae5fcbd4..64e280fed911 100644
> > --- a/fs/ext4/inode.c
> > +++ b/fs/ext4/inode.c
> > @@ -5007,8 +5007,16 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
> > inode->i_op = &ext4_encrypted_symlink_inode_operations;
> > } else if (ext4_inode_is_fast_symlink(inode)) {
> > inode->i_op = &ext4_fast_symlink_inode_operations;
> > - nd_terminate_link(ei->i_data, inode->i_size,
> > - sizeof(ei->i_data) - 1);
> > + if (inode->i_size == 0 ||
> > + inode->i_size >= sizeof(ei->i_data) ||
> > + strnlen((char *)ei->i_data, inode->i_size + 1) !=
> > + inode->i_size) {
> > + ext4_error_inode(inode, function, line, 0,
> > + "invalid fast symlink length %llu",
> > + (unsigned long long)inode->i_size);
> > + ret = -EFSCORRUPTED;
> > + goto bad_inode;
> > + }
> > inode_set_cached_link(inode, (char *)ei->i_data,
> > inode->i_size);
>
>
> I don't think this will do the right thing if the fast symlink is
> encrypted. See ext4_encrypted_get_link() in fs/ext4/symlink.c in the
> kernel sources, and also look at how e2fsck_pass1_check_symlink()
> handles checking the size of an encrypted, fast symlink.
>
Encrypted symlinks are handled separately just a couple lines above.
- Eric
next prev parent reply other threads:[~2025-02-06 16:04 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-06 9:44 [PATCH] ext4: Verify fast symlink length Jan Kara
2025-02-06 15:24 ` Theodore Ts'o
2025-02-06 16:04 ` Eric Biggers [this message]
2025-02-07 12:54 ` Jan Kara
2025-02-06 15:34 ` Darrick J. Wong
2025-02-10 13:50 ` Baokun Li
2025-03-18 3:41 ` Theodore Ts'o
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250206160453.GA4283@sol.localdomain \
--to=ebiggers@kernel.org \
--cc=djwong@kernel.org \
--cc=jack@suse.cz \
--cc=linux-ext4@vger.kernel.org \
--cc=syzbot+48a99e426f29859818c0@syzkaller.appspotmail.com \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.