diff --git a/icetransport.go b/icetransport.go index 328cbfd3..5ec7a097 100644 --- a/icetransport.go +++ b/icetransport.go @@ -148,7 +148,10 @@ func (t *ICETransport) Stop() error { if t.mux != nil { return t.mux.Close() + } else if t.gatherer != nil { + return t.gatherer.Close() } + return nil } diff --git a/peerconnection_close_test.go b/peerconnection_close_test.go index 4a3c273c..68786e42 100644 --- a/peerconnection_close_test.go +++ b/peerconnection_close_test.go @@ -55,3 +55,37 @@ func TestPeerConnection_Close(t *testing.T) { t.Fatal(err) } } + +// Assert that a PeerConnection that is shutdown before ICE starts doesn't leak +func TestPeerConnection_Close_PreICE(t *testing.T) { + // Limit runtime in case of deadlocks + lim := test.TimeOut(time.Second * 20) + defer lim.Stop() + + report := test.CheckRoutines(t) + defer report() + + pcOffer, pcAnswer, err := newPair() + if err != nil { + t.Fatal(err) + } + + answer, err := pcOffer.CreateOffer(nil) + if err != nil { + t.Fatal(err) + } + + err = pcOffer.Close() + if err != nil { + t.Fatal(err) + } + + if err = pcAnswer.SetRemoteDescription(answer); err != nil { + t.Fatal(err) + } + + err = pcAnswer.Close() + if err != nil { + t.Fatal(err) + } +}