From ad9ac6d07ce1819260c2b7f090fd4fe742c80d9f Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sun, 10 Jul 2022 23:49:07 -0600 Subject: Fuzz btrfsitem, and by consequence improve binstruct errors --- lib/btrfs/btrfsitem/item_rootref.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'lib/btrfs/btrfsitem/item_rootref.go') diff --git a/lib/btrfs/btrfsitem/item_rootref.go b/lib/btrfs/btrfsitem/item_rootref.go index 228ab55..1ee0ee4 100644 --- a/lib/btrfs/btrfsitem/item_rootref.go +++ b/lib/btrfs/btrfsitem/item_rootref.go @@ -5,7 +5,10 @@ package btrfsitem import ( + "fmt" + "git.lukeshu.com/btrfs-progs-ng/lib/binstruct" + "git.lukeshu.com/btrfs-progs-ng/lib/binstruct/binutil" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/internal" ) @@ -18,10 +21,20 @@ type RootRef struct { // ROOT_REF=156 ROOT_BACKREF=144 } func (o *RootRef) UnmarshalBinary(dat []byte) (int, error) { + if err := binutil.NeedNBytes(dat, 0x12); err != nil { + return 0, err + } n, err := binstruct.UnmarshalWithoutInterface(dat, o) if err != nil { return n, err } + if o.NameLen > MaxNameLen { + return 0, fmt.Errorf("maximum name len is %v, but .NameLen=%v", + MaxNameLen, o.NameLen) + } + if err := binutil.NeedNBytes(dat, 0x12+int(o.NameLen)); err != nil { + return 0, err + } o.Name = dat[n : n+int(o.NameLen)] n += int(o.NameLen) return n, nil -- cgit v1.2.3-2-g168b