Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
dms3
go-dms3
Commits
8f362d2b
Commit
8f362d2b
authored
Sep 08, 2016
by
Jeromy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dht: protect against a panic in case record on pbmessage is nil
License: MIT Signed-off-by:
Jeromy
<
why@ipfs.io
>
parent
7c00bcf3
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
26 additions
and
5 deletions
+26
-5
routing/dht/dht_test.go
routing/dht/dht_test.go
+15
-2
routing/dht/handlers.go
routing/dht/handlers.go
+7
-3
routing/dht/records.go
routing/dht/records.go
+4
-0
No files found.
routing/dht/dht_test.go
View file @
8f362d2b
...
@@ -11,14 +11,15 @@ import (
...
@@ -11,14 +11,15 @@ import (
key "github.com/ipfs/go-ipfs/blocks/key"
key "github.com/ipfs/go-ipfs/blocks/key"
routing "github.com/ipfs/go-ipfs/routing"
routing "github.com/ipfs/go-ipfs/routing"
pb "github.com/ipfs/go-ipfs/routing/dht/pb"
record "github.com/ipfs/go-ipfs/routing/record"
record "github.com/ipfs/go-ipfs/routing/record"
ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci"
ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci"
travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis"
travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis"
ds
"gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore"
dssync
"gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync"
pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore"
pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore"
peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer"
peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer"
ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore"
dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync"
netutil "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/test/util"
netutil "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/test/util"
ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr"
ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr"
u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util"
u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util"
...
@@ -826,3 +827,15 @@ func TestConnectCollision(t *testing.T) {
...
@@ -826,3 +827,15 @@ func TestConnectCollision(t *testing.T) {
dhtB.host.Close()
dhtB.host.Close()
}
}
}
}
func TestBadProtoMessages(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
d := setupDHT(ctx, t)
nilrec := new(pb.Message)
if _, err := d.handlePutValue(ctx, "testpeer", nilrec); err == nil {
t.Fatal("should have errored on nil record")
}
}
routing/dht/handlers.go
View file @
8f362d2b
...
@@ -150,13 +150,17 @@ func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Mess
...
@@ -150,13 +150,17 @@ func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Mess
defer
log
.
EventBegin
(
ctx
,
"handlePutValue"
,
p
)
.
Done
()
defer
log
.
EventBegin
(
ctx
,
"handlePutValue"
,
p
)
.
Done
()
dskey
:=
key
.
Key
(
pmes
.
GetKey
())
.
DsKey
()
dskey
:=
key
.
Key
(
pmes
.
GetKey
())
.
DsKey
()
if
err
:=
dht
.
verifyRecordLocally
(
pmes
.
GetRecord
());
err
!=
nil
{
rec
:=
pmes
.
GetRecord
()
if
rec
==
nil
{
log
.
Infof
(
"Got nil record from: %s"
,
p
.
Pretty
())
return
nil
,
errors
.
New
(
"nil record"
)
}
if
err
:=
dht
.
verifyRecordLocally
(
rec
);
err
!=
nil
{
log
.
Warningf
(
"Bad dht record in PUT from: %s. %s"
,
key
.
Key
(
pmes
.
GetRecord
()
.
GetAuthor
()),
err
)
log
.
Warningf
(
"Bad dht record in PUT from: %s. %s"
,
key
.
Key
(
pmes
.
GetRecord
()
.
GetAuthor
()),
err
)
return
nil
,
err
return
nil
,
err
}
}
rec
:=
pmes
.
GetRecord
()
// record the time we receive every record
// record the time we receive every record
rec
.
TimeReceived
=
proto
.
String
(
u
.
FormatRFC3339
(
time
.
Now
()))
rec
.
TimeReceived
=
proto
.
String
(
u
.
FormatRFC3339
(
time
.
Now
()))
...
...
routing/dht/records.go
View file @
8f362d2b
...
@@ -107,6 +107,10 @@ func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.Pub
...
@@ -107,6 +107,10 @@ func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.Pub
// verifyRecordLocally attempts to verify a record. if we do not have the public
// verifyRecordLocally attempts to verify a record. if we do not have the public
// key, we fail. we do not search the dht.
// key, we fail. we do not search the dht.
func
(
dht
*
IpfsDHT
)
verifyRecordLocally
(
r
*
pb
.
Record
)
error
{
func
(
dht
*
IpfsDHT
)
verifyRecordLocally
(
r
*
pb
.
Record
)
error
{
if
r
==
nil
{
log
.
Error
(
"nil record passed into verifyRecordLocally"
)
return
fmt
.
Errorf
(
"nil record"
)
}
if
len
(
r
.
Signature
)
>
0
{
if
len
(
r
.
Signature
)
>
0
{
// First, validate the signature
// First, validate the signature
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment