diff --git a/swarm_dial.go b/swarm_dial.go index 68d8cfecb8ae2bebd7eb264ee6972e1aa15545a2..e130c18301a0d2015c27e462efefba50dc86c42c 100644 --- a/swarm_dial.go +++ b/swarm_dial.go @@ -226,7 +226,12 @@ func (s *Swarm) DialPeer(ctx context.Context, p peer.ID) (network.Conn, error) { return nil, &DialError{Peer: p, Cause: ErrGaterDisallowedConnection} } - return s.dialPeer(ctx, p) + // Avoid typed nil issues. + c, err := s.dialPeer(ctx, p) + if err != nil { + return nil, err + } + return c, nil } // internal dial method that returns an unwrapped conn diff --git a/swarm_test.go b/swarm_test.go index 6aad60006b895a9438799fd9dc1f5be6eee0454d..97ea90762d4cc2539123f4859010e1b4e8127896 100644 --- a/swarm_test.go +++ b/swarm_test.go @@ -412,6 +412,19 @@ func TestCloseWithOpenStreams(t *testing.T) { } } +func TestTypedNilConn(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + s := GenSwarm(t, ctx) + defer s.Close() + + // We can't dial ourselves. + c, err := s.DialPeer(ctx, s.LocalPeer()) + require.Error(t, err) + // If we fail to dial, the connection should be nil. + require.True(t, c == nil) +} + func TestPreventDialListenAddr(t *testing.T) { s := GenSwarm(t, context.Background(), OptDialOnly) if err := s.Listen(ma.StringCast("/ip4/0.0.0.0/udp/0/quic")); err != nil {