diff --git a/core/pathresolver.go b/core/pathresolver.go index 367b82001..610eeb50b 100644 --- a/core/pathresolver.go +++ b/core/pathresolver.go @@ -29,6 +29,11 @@ func Resolve(ctx context.Context, n *IpfsNode, p path.Path) (*merkledag.Node, er } seg := p.Segments() + + if len(seg) < 2 || seg[1] == "" { // just "/" without further segments + return nil, path.ErrNoComponents + } + extensions := seg[2:] resolvable, err := path.FromSegments("/", seg[0], seg[1]) if err != nil { diff --git a/core/pathresolver_test.go b/core/pathresolver_test.go new file mode 100644 index 000000000..2b694fc4b --- /dev/null +++ b/core/pathresolver_test.go @@ -0,0 +1,25 @@ +package core + +import ( + "testing" + + path "github.com/ipfs/go-ipfs/path" +) + +func TestResolveNoComponents(t *testing.T) { + n, err := NewMockNode() + if n == nil || err != nil { + t.Fatal("Should have constructed a mock node", err) + } + + _, err = Resolve(n.Context(), n, path.Path("/ipns/")) + if err != path.ErrNoComponents { + t.Fatal("Should error with no components (/ipns/).", err) + } + + _, err = Resolve(n.Context(), n, path.Path("/ipfs/")) + if err != path.ErrNoComponents { + t.Fatal("Should error with no components (/ipfs/).", err) + } + +} diff --git a/path/resolver.go b/path/resolver.go index a08df8741..b4d6239dd 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -4,6 +4,7 @@ package path import ( "fmt" "time" + "errors" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" @@ -14,6 +15,10 @@ import ( var log = u.Logger("path") +// Paths after a protocol must contain at least one component +var ErrNoComponents = errors.New( + "path must contain at least one component") + // ErrNoLink is returned when a link is not found in a path type ErrNoLink struct { name string @@ -43,7 +48,7 @@ func SplitAbsPath(fpath Path) (mh.Multihash, []string, error) { // if nothing, bail. if len(parts) == 0 { - return nil, nil, fmt.Errorf("ipfs path must contain at least one component") + return nil, nil, ErrNoComponents } // first element in the path is a b58 hash (for now)