mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
ntfs3: fix info-leak in ntfs_rename()
Hard to say about copy_to_user_iter(), but at least the first splat
looks correct. At the end of fill_name_de(), data layout is:
struct NTFS_DE *e = buf;
...
|<- data_size + sizeof(struct NTFS_DE) ->|<- XXX ->|
buf |-----------------------------------------------------------
|<- ALIGN(data_size, 8) + sizeof(struct NTFS_DE) ->| ;; e->size
If 'buf' was allocated with kmalloc(), XXX remains uninitialized and
passed as such to memcpy() called from hdr_insert_de().
So using kzalloc() for all buffers passed to fill_name_de() looks
the simplest and most safe solution. OTOH if someone would have
said that an overhead of PAGE_SIZE'd memset() is too large, more
fine-granted solution is to memset() XXX only.
Reported-by: syzbot+905d785c4923bea2c1db@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=905d785c4923bea2c1db
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
This commit is contained in:
parent
71a25f2593
commit
2fa56613b2
|
|
@ -22,7 +22,7 @@ int fill_name_de(struct ntfs_sb_info *sbi, void *buf, const struct qstr *name,
|
|||
{
|
||||
int err;
|
||||
struct NTFS_DE *e = buf;
|
||||
u16 data_size;
|
||||
u16 data_size, real_size, aligned_size;
|
||||
struct ATTR_FILE_NAME *fname = (struct ATTR_FILE_NAME *)(e + 1);
|
||||
|
||||
#ifndef CONFIG_NTFS3_64BIT_CLUSTER
|
||||
|
|
@ -53,7 +53,12 @@ int fill_name_de(struct ntfs_sb_info *sbi, void *buf, const struct qstr *name,
|
|||
fname->type = FILE_NAME_POSIX;
|
||||
data_size = fname_full_size(fname);
|
||||
|
||||
e->size = cpu_to_le16(ALIGN(data_size, 8) + sizeof(struct NTFS_DE));
|
||||
real_size = data_size + sizeof(struct NTFS_DE);
|
||||
aligned_size = ALIGN(data_size, 8) + sizeof(struct NTFS_DE);
|
||||
if (aligned_size > real_size)
|
||||
memset((char *)buf + real_size, 0, aligned_size - real_size);
|
||||
|
||||
e->size = cpu_to_le16(aligned_size);
|
||||
e->key_size = cpu_to_le16(data_size);
|
||||
e->flags = 0;
|
||||
e->res = 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user