From a1d207343aa1599f7caae663a243cd80b512a520 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 16 Jul 2018 10:54:17 -0300 Subject: [PATCH 1/2] unixfs: refactor switch in `precalcNextBuf` Do not use `NewDagReader` just for the `RawNode` case. Treat invalid UnixFS types in the same case. License: MIT Signed-off-by: Lucas Molas --- unixfs/io/dagreader.go | 4 ++-- unixfs/io/pbdagreader.go | 16 +++++----------- unixfs/unixfs.go | 1 - 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 79cf387b249..867c4b1d9e9 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -3,7 +3,6 @@ package io import ( "context" "errors" - "fmt" "io" mdag "github.com/ipfs/go-ipfs/merkledag" @@ -17,6 +16,7 @@ import ( var ( ErrIsDir = errors.New("this dag node is a directory") ErrCantReadSymlinks = errors.New("cannot currently read symlinks") + ErrUnkownNodeType = errors.New("unknown node type") ) // A DagReader provides read-only read and seek acess to a unixfs file. @@ -74,6 +74,6 @@ func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagRe return nil, ft.ErrUnrecognizedType } default: - return nil, fmt.Errorf("unrecognized node type") + return nil, ErrUnkownNodeType } } diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 5ce2cc3bf72..5b7bceb9e6c 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -106,26 +106,20 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { } switch fsNode.Type() { - case ftpb.Data_Directory, ftpb.Data_HAMTShard: - // A directory should not exist within a file - return ft.ErrInvalidDirLocation case ftpb.Data_File: dr.buf = NewPBFileReader(dr.ctx, nxt, fsNode, dr.serv) return nil case ftpb.Data_Raw: dr.buf = NewBufDagReader(fsNode.Data()) return nil - case ftpb.Data_Metadata: - return errors.New("shouldnt have had metadata object inside file") - case ftpb.Data_Symlink: - return errors.New("shouldnt have had symlink inside file") default: - return ft.ErrUnrecognizedType + return fmt.Errorf("found %s node in unexpected place", fsNode.Type().String()) } + case *mdag.RawNode: + dr.buf = NewBufDagReader(nxt.RawData()) + return nil default: - var err error - dr.buf, err = NewDagReader(ctx, nxt, dr.serv) - return err + return ErrUnkownNodeType } } diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 9cd9731ed9d..bec222f0c83 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -25,7 +25,6 @@ const ( // Common errors var ( ErrMalformedFileFormat = errors.New("malformed data in file format") - ErrInvalidDirLocation = errors.New("found directory node in unexpected place") ErrUnrecognizedType = errors.New("unrecognized node type") ) From 13d911008823399ccbe356f564ae4b40373eb8d5 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 16 Jul 2018 11:14:27 -0300 Subject: [PATCH 2/2] unixfs: split `precalcNextBuf` Create new `loadBufNode` function to handle the `buf` logic which is unrelated to the main `precalcNextBuf` logic of processing promises to fetch nodes. License: MIT Signed-off-by: Lucas Molas --- unixfs/io/pbdagreader.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 5b7bceb9e6c..53d85c796bf 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -98,16 +98,20 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { dr.promises[dr.linkPosition] = nil dr.linkPosition++ - switch nxt := nxt.(type) { + return dr.loadBufNode(nxt) +} + +func (dr *PBDagReader) loadBufNode(node ipld.Node) error { + switch node := node.(type) { case *mdag.ProtoNode: - fsNode, err := ft.FSNodeFromBytes(nxt.Data()) + fsNode, err := ft.FSNodeFromBytes(node.Data()) if err != nil { return fmt.Errorf("incorrectly formatted protobuf: %s", err) } switch fsNode.Type() { case ftpb.Data_File: - dr.buf = NewPBFileReader(dr.ctx, nxt, fsNode, dr.serv) + dr.buf = NewPBFileReader(dr.ctx, node, fsNode, dr.serv) return nil case ftpb.Data_Raw: dr.buf = NewBufDagReader(fsNode.Data()) @@ -116,7 +120,7 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { return fmt.Errorf("found %s node in unexpected place", fsNode.Type().String()) } case *mdag.RawNode: - dr.buf = NewBufDagReader(nxt.RawData()) + dr.buf = NewBufDagReader(node.RawData()) return nil default: return ErrUnkownNodeType