Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions filesystem/ext4/ext4.go
Original file line number Diff line number Diff line change
Expand Up @@ -1272,6 +1272,9 @@ func (fs *FileSystem) OpenFile(p string, flag int) (filesystem.File, error) {
}
return fs.OpenFile(linkTarget, flag)
}
if inode.extents == nil {
return nil, fmt.Errorf("cannot open special file %s (inode %d): no extent tree", p, inodeNumber)
}
offset := int64(0)
if flag&os.O_APPEND == os.O_APPEND {
offset = int64(inode.size)
Expand Down Expand Up @@ -1306,6 +1309,9 @@ func (fs *FileSystem) openFileViaInode(inodeNumber uint32, flag int) (filesystem
if inode.fileType == fileTypeSymbolicLink {
return nil, fmt.Errorf("cannot open file via inode: inode %d is a symbolic link", inodeNumber)
}
if inode.extents == nil {
return nil, fmt.Errorf("cannot open special file (inode %d): no extent tree", inodeNumber)
}
offset := int64(0)
if flag&os.O_APPEND == os.O_APPEND {
offset = int64(inode.size)
Expand Down
31 changes: 31 additions & 0 deletions filesystem/ext4/specialfile_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ext4

import (
"os"
"strings"
"testing"

"github.com/diskfs/go-diskfs/backend/file"
)

func TestOpenFileSpecialFileReturnsError(t *testing.T) {
f, err := os.Open(imgFile)
if err != nil {
t.Fatalf("Error opening test image: %v", err)
}
defer f.Close()

b := file.New(f, true)
fs, err := Read(b, 100*MB, 0, 512)
if err != nil {
t.Fatalf("Error reading filesystem: %v", err)
}

_, err = fs.OpenFile("/chardev", os.O_RDONLY)
if err == nil {
t.Fatal("OpenFile on character device should return an error, not succeed")
}
if !strings.Contains(err.Error(), "cannot open special file") {
t.Errorf("expected 'cannot open special file' error, got: %v", err)
}
}
2 changes: 2 additions & 0 deletions filesystem/ext4/testdata/buildimg.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ln -s nonexistent deadlink
ln -s /some/really/long/path/that/does/not/exist/and/does/not/fit/in/symlink deadlonglink # the target here is >60 chars and so will not fit within the inode
# hardlink
ln random.dat hardlink.dat
# character device for special file tests
mknod chardev c 1 3
cd /data
umount /mnt

Expand Down