summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-10 23:49:07 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-11 00:44:30 -0600
commitad9ac6d07ce1819260c2b7f090fd4fe742c80d9f (patch)
treeab6a607ea8575382c978f07de943ccf6c077de7c /cmd
parent41ef03aabf8d6db4f926480fc5ddfec014e342d3 (diff)
Fuzz btrfsitem, and by consequence improve binstruct errors
Diffstat (limited to 'cmd')
-rw-r--r--cmd/btrfs-ls-files/main.go54
1 files changed, 21 insertions, 33 deletions
diff --git a/cmd/btrfs-ls-files/main.go b/cmd/btrfs-ls-files/main.go
index 36d14ed..0f27def 100644
--- a/cmd/btrfs-ls-files/main.go
+++ b/cmd/btrfs-ls-files/main.go
@@ -93,48 +93,36 @@ func printDir(fs *btrfs.FS, fsTree btrfs.ObjID, prefix0, prefix1, dirName string
case btrfsitem.INODE_REF_KEY:
// TODO
case btrfsitem.DIR_ITEM_KEY:
- body := item.Body.(btrfsitem.DirEntries)
- if len(body) != 1 {
- errs = append(errs, fmt.Errorf("read dir: multiple direntries in single DIR_ITEM?"))
+ entry := item.Body.(btrfsitem.DirEntry)
+ namehash := btrfsitem.NameHash(entry.Name)
+ if namehash != item.Head.Key.Offset {
+ errs = append(errs, fmt.Errorf("read dir: direntry crc32c mismatch: key=%#x crc32c(%q)=%#x",
+ item.Head.Key.Offset, entry.Name, namehash))
continue
}
- for _, entry := range body {
- namehash := btrfsitem.NameHash(entry.Name)
- if namehash != item.Head.Key.Offset {
- errs = append(errs, fmt.Errorf("read dir: direntry crc32c mismatch: key=%#x crc32c(%q)=%#x",
- item.Head.Key.Offset, entry.Name, namehash))
- continue
- }
- if other, exists := membersByNameHash[namehash]; exists {
- if !reflect.DeepEqual(entry, other) {
- if string(entry.Name) == string(other.Name) {
- errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry crc32c(%q)=%#x",
- entry.Name, namehash))
- } else {
- errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry crc32c(%q|%q)=%#x",
- other.Name, entry.Name, namehash))
- }
+ if other, exists := membersByNameHash[namehash]; exists {
+ if !reflect.DeepEqual(entry, other) {
+ if string(entry.Name) == string(other.Name) {
+ errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry crc32c(%q)=%#x",
+ entry.Name, namehash))
+ } else {
+ errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry crc32c(%q|%q)=%#x",
+ other.Name, entry.Name, namehash))
}
- continue
}
- membersByNameHash[btrfsitem.NameHash(entry.Name)] = entry
+ continue
}
+ membersByNameHash[btrfsitem.NameHash(entry.Name)] = entry
case btrfsitem.DIR_INDEX_KEY:
index := item.Head.Key.Offset
- body := item.Body.(btrfsitem.DirEntries)
- if len(body) != 1 {
- errs = append(errs, fmt.Errorf("read dir: multiple direntries in single DIR_INDEX?"))
- continue
- }
- for _, entry := range body {
- if other, exists := membersByIndex[index]; exists {
- if !reflect.DeepEqual(entry, other) {
- errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry index %v", index))
- }
- continue
+ entry := item.Body.(btrfsitem.DirEntry)
+ if other, exists := membersByIndex[index]; exists {
+ if !reflect.DeepEqual(entry, other) {
+ errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry index %v", index))
}
- membersByIndex[index] = entry
+ continue
}
+ membersByIndex[index] = entry
//case btrfsitem.XATTR_ITEM_KEY:
default:
errs = append(errs, fmt.Errorf("TODO: handle item type %v", item.Head.Key.ItemType))