mount, cmount: don't pass huge filenames (>4k) to FUSE as it can't cope

s3-about
Nick Craig-Wood 2019-10-18 10:53:07 +01:00
parent 76f5e273d2
commit 59026c4761
3 changed files with 18 additions and 2 deletions

View File

@ -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)

View File

@ -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

View File

@ -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" {