diff --git a/cmd/cmount/fs.go b/cmd/cmount/fs.go index 1ae98cc96..d0e5665a8 100644 --- a/cmd/cmount/fs.go +++ b/cmd/cmount/fs.go @@ -246,7 +246,12 @@ func (fsys *FS) Readdir(dirPath string, for _, item := range items { node, ok := item.(vfs.Node) if ok { - fill(node.Name(), nil, 0) + name := node.Name() + if len(name) > mountlib.MaxLeafSize { + fs.Errorf(dirPath, "Name too long (%d bytes) for FUSE, skipping: %s", len(name), name) + continue + } + fill(name, nil, 0) } } itemsRead = len(items) diff --git a/cmd/mount/dir.go b/cmd/mount/dir.go index d6c1c1869..bd3cdbd8d 100644 --- a/cmd/mount/dir.go +++ b/cmd/mount/dir.go @@ -11,6 +11,7 @@ import ( fusefs "bazil.org/fuse/fs" "github.com/pkg/errors" "github.com/rclone/rclone/cmd/mountlib" + "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/log" "github.com/rclone/rclone/vfs" ) @@ -96,10 +97,15 @@ func (d *Dir) ReadDirAll(ctx context.Context) (dirents []fuse.Dirent, err error) return nil, translateError(err) } for _, node := range items { + name := node.Name() + if len(name) >= mountlib.MaxLeafSize { + fs.Errorf(d, "Name too long (%d bytes) for FUSE, skipping: %s", len(name), name) + continue + } var dirent = fuse.Dirent{ // Inode FIXME ??? Type: fuse.DT_File, - Name: node.Name(), + Name: name, } if node.IsDir() { dirent.Type = fuse.DT_Dir diff --git a/cmd/mountlib/mount.go b/cmd/mountlib/mount.go index 9d0e3d41a..2d5b4fb7f 100644 --- a/cmd/mountlib/mount.go +++ b/cmd/mountlib/mount.go @@ -38,6 +38,11 @@ var ( DaemonTimeout time.Duration // OSXFUSE only ) +// Global constants +const ( + MaxLeafSize = 4095 // don't pass file names longer than this +) + func init() { // DaemonTimeout defaults to non zero for macOS if runtime.GOOS == "darwin" {