From ef8476bd27b3de319199b8f330f4a484978241cc Mon Sep 17 00:00:00 2001 From: Sandy Xu Date: Wed, 30 Mar 2022 18:00:50 +0800 Subject: [PATCH 1/2] meta: forbid empty name for dentry --- pkg/meta/base.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/meta/base.go b/pkg/meta/base.go index 79650d9ca45d..663fc43fa91e 100644 --- a/pkg/meta/base.go +++ b/pkg/meta/base.go @@ -591,6 +591,9 @@ func (m *baseMeta) Mknod(ctx Context, parent Ino, name string, _type uint8, mode if m.conf.ReadOnly { return syscall.EROFS } + if name == "" { + return syscall.ENOENT + } defer timeit(time.Now()) if m.checkQuota(4<<10, 1) { @@ -631,6 +634,9 @@ func (m *baseMeta) Link(ctx Context, inode, parent Ino, name string, attr *Attr) if m.conf.ReadOnly { return syscall.EROFS } + if name == "" { + return syscall.ENOENT + } defer timeit(time.Now()) parent = m.checkRoot(parent) @@ -696,6 +702,9 @@ func (m *baseMeta) Rename(ctx Context, parentSrc Ino, nameSrc string, parentDst if m.conf.ReadOnly { return syscall.EROFS } + if nameDst == "" { + return syscall.ENOENT + } switch flags { case 0, RenameNoReplace, RenameExchange: case RenameWhiteout, RenameNoReplace | RenameWhiteout: From 9e5d18000a73d20df168cd57ee74201b6b66acf1 Mon Sep 17 00:00:00 2001 From: Sandy Xu Date: Wed, 30 Mar 2022 21:14:41 +0800 Subject: [PATCH 2/2] meta: readdir skips entry with empty name --- pkg/meta/redis.go | 8 ++++++-- pkg/meta/sql.go | 4 ++++ pkg/meta/tkv.go | 8 ++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pkg/meta/redis.go b/pkg/meta/redis.go index fe8893462ca4..9bf140da019e 100644 --- a/pkg/meta/redis.go +++ b/pkg/meta/redis.go @@ -1577,9 +1577,13 @@ func (r *redisMeta) doReaddir(ctx Context, inode Ino, plus uint8, entries *[]*En newEntries := make([]Entry, len(keys)/2) newAttrs := make([]Attr, len(keys)/2) for i := 0; i < len(keys); i += 2 { - typ, inode := r.parseEntry([]byte(keys[i+1])) + typ, ino := r.parseEntry([]byte(keys[i+1])) + if keys[i] == "" { + logger.Errorf("Corrupt entry with empty name: inode %d parent %d", ino, inode) + continue + } ent := &newEntries[i/2] - ent.Inode = inode + ent.Inode = ino ent.Name = []byte(keys[i]) ent.Attr = &newAttrs[i/2] ent.Attr.Typ = typ diff --git a/pkg/meta/sql.go b/pkg/meta/sql.go index 30b2dbf84367..d1523504945f 100644 --- a/pkg/meta/sql.go +++ b/pkg/meta/sql.go @@ -1589,6 +1589,10 @@ func (m *dbMeta) doReaddir(ctx Context, inode Ino, plus uint8, entries *[]*Entry return errno(err) } for _, n := range nodes { + if n.Name == "" { + logger.Errorf("Corrupt entry with empty name: inode %d parent %d", n.Inode, inode) + continue + } entry := &Entry{ Inode: n.Inode, Name: []byte(n.Name), diff --git a/pkg/meta/tkv.go b/pkg/meta/tkv.go index 0bd1a6551ae0..f9d1d3a1a781 100644 --- a/pkg/meta/tkv.go +++ b/pkg/meta/tkv.go @@ -1426,9 +1426,13 @@ func (m *kvMeta) doReaddir(ctx Context, inode Ino, plus uint8, entries *[]*Entry } prefix := len(m.entryKey(inode, "")) for name, buf := range vals { - typ, inode := m.parseEntry(buf) + typ, ino := m.parseEntry(buf) + if len(name) == prefix { + logger.Errorf("Corrupt entry with empty name: inode %d parent %d", ino, inode) + continue + } *entries = append(*entries, &Entry{ - Inode: inode, + Inode: ino, Name: []byte(name)[prefix:], Attr: &Attr{Typ: typ}, })