Unverified Commit 5b1de2f5 authored by Steven Allen's avatar Steven Allen Committed by GitHub

Merge pull request #105 from multiformats/feat/no-empty-multiadd

forbid empty multiaddrs
parents fddba870 020c4d17
......@@ -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)
......@@ -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 {
......@@ -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 {
......
......@@ -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.")
......
......@@ -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 {
......@@ -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",
......@@ -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)
}
}
......@@ -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")
}
}
......@@ -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")
}
}
......@@ -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")
}
}
......
......@@ -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)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment