Skip to content

Commit

Permalink
Merge pull request #105 from multiformats/feat/no-empty-multiadd
Browse files Browse the repository at this point in the history
forbid empty multiaddrs
  • Loading branch information
Stebalien committed May 20, 2019
2 parents fddba87 + 020c4d1 commit 5b1de2f
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 9 deletions.
10 changes: 10 additions & 0 deletions codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ func stringToBytes(s string) ([]byte, error) {
// consume first empty elem
sp = sp[1:]

if len(sp) == 0 {
return nil, fmt.Errorf("failed to parse multiaddr %q: empty multiaddr", s)
}

for len(sp) > 0 {
name := sp[0]
p := ProtocolWithName(name)
Expand Down Expand Up @@ -58,6 +62,9 @@ func stringToBytes(s string) ([]byte, error) {
}

func validateBytes(b []byte) (err error) {
if len(b) == 0 {
return fmt.Errorf("empty multiaddr")
}
for len(b) > 0 {
code, n, err := ReadVarintCode(b)
if err != nil {
Expand Down Expand Up @@ -136,6 +143,9 @@ func readComponent(b []byte) (int, Component, error) {
}

func bytesToString(b []byte) (ret string, err error) {
if len(b) == 0 {
return "", fmt.Errorf("empty multiaddr")
}
var buf strings.Builder

for len(b) > 0 {
Expand Down
4 changes: 4 additions & 0 deletions multiaddr.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,10 @@ func (m *multiaddr) Decapsulate(o Multiaddr) Multiaddr {
return &multiaddr{bytes: cpy}
}

if i == 0 {
return nil
}

ma, err := NewMultiaddr(s1[:i])
if err != nil {
panic("Multiaddr.Decapsulate incorrect byte boundaries.")
Expand Down
25 changes: 17 additions & 8 deletions multiaddr_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ func TestConstructFails(t *testing.T) {
"/unix",
"/ip4/1.2.3.4/tcp/80/unix",
"/ip4/127.0.0.1/tcp/9090/http/p2p-webcrt-direct",
"/",
"",
}

for _, a := range cases {
Expand All @@ -83,6 +85,13 @@ func TestConstructFails(t *testing.T) {
}
}

func TestEmptyMultiaddr(t *testing.T) {
_, err := NewMultiaddrBytes([]byte{})
if err == nil {
t.Fatal("should have failed to parse empty multiaddr")
}
}

func TestConstructSucceeds(t *testing.T) {
cases := []string{
"/ip4/1.2.3.4",
Expand Down Expand Up @@ -377,8 +386,8 @@ func TestEncapsulate(t *testing.T) {

m4, _ := NewMultiaddr("/ip4/127.0.0.1")
d := c.Decapsulate(m4)
if s := d.String(); s != "" {
t.Error("decapsulate /ip4 failed.", "/", s)
if d != nil {
t.Error("decapsulate /ip4 failed: ", d)
}
}

Expand Down Expand Up @@ -582,11 +591,11 @@ func TestBinaryMarshaler(t *testing.T) {
t.Fatal(err)
}

addr2 := newMultiaddr(t, "")
var addr2 multiaddr
if err = addr2.UnmarshalBinary(b); err != nil {
t.Fatal(err)
}
if !addr.Equal(addr2) {
if !addr.Equal(&addr2) {
t.Error("expected equal addresses in circular marshaling test")
}
}
Expand All @@ -598,11 +607,11 @@ func TestTextMarshaler(t *testing.T) {
t.Fatal(err)
}

addr2 := newMultiaddr(t, "")
var addr2 multiaddr
if err = addr2.UnmarshalText(b); err != nil {
t.Fatal(err)
}
if !addr.Equal(addr2) {
if !addr.Equal(&addr2) {
t.Error("expected equal addresses in circular marshaling test")
}
}
Expand All @@ -614,11 +623,11 @@ func TestJSONMarshaler(t *testing.T) {
t.Fatal(err)
}

addr2 := newMultiaddr(t, "")
var addr2 multiaddr
if err = addr2.UnmarshalJSON(b); err != nil {
t.Fatal(err)
}
if !addr.Equal(addr2) {
if !addr.Equal(&addr2) {
t.Error("expected equal addresses in circular marshaling test")
}
}
Expand Down
1 change: 0 additions & 1 deletion util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ func TestSplitFirstLast(t *testing.T) {
[]string{ipStr, tcpStr, ipfsStr},
[]string{ipStr, tcpStr},
[]string{ipStr},
[]string{},
} {
addr := StringCast(strings.Join(x, ""))
head, tail := SplitFirst(addr)
Expand Down

0 comments on commit 5b1de2f

Please sign in to comment.