Skip to content

Commit fe41afd

Browse files
committed
Fix deadlock in DataChannel with mutex unlock
Fulfill request changes in PR 3009 Close answer and assert errors in detach tests
1 parent 49b555b commit fe41afd

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

datachannel.go

+2
Original file line numberDiff line numberDiff line change
@@ -464,10 +464,12 @@ func (d *DataChannel) DetachWithDeadline() (datachannel.ReadWriteCloserDeadliner
464464
d.mu.Lock()
465465

466466
if !d.api.settingEngine.detach.DataChannels {
467+
d.mu.Unlock()
467468
return nil, errDetachNotEnabled
468469
}
469470

470471
if d.dataChannel == nil {
472+
d.mu.Unlock()
471473
return nil, errDetachBeforeOpened
472474
}
473475

datachannel_go_test.go

+27
Original file line numberDiff line numberDiff line change
@@ -822,3 +822,30 @@ func TestDataChannelClose(t *testing.T) {
822822
assert.NoError(t, answerPC.Close())
823823
})
824824
}
825+
826+
func TestDataChannel_DetachErrors(t *testing.T) {
827+
t.Run("error errDetachNotEnabled", func(t *testing.T) {
828+
s := SettingEngine{}
829+
offer, answer, err := NewAPI(WithSettingEngine(s)).newPair(Configuration{})
830+
assert.NoError(t, err)
831+
dc, err := offer.CreateDataChannel("data", nil)
832+
assert.NoError(t, err)
833+
_, err = dc.Detach()
834+
assert.ErrorIs(t, err, errDetachNotEnabled)
835+
assert.NoError(t, offer.Close())
836+
assert.NoError(t, answer.Close())
837+
})
838+
839+
t.Run("error errDetachBeforeOpened", func(t *testing.T) {
840+
s := SettingEngine{}
841+
s.DetachDataChannels()
842+
offer, answer, err := NewAPI(WithSettingEngine(s)).newPair(Configuration{})
843+
assert.NoError(t, err)
844+
dc, err := offer.CreateDataChannel("data", nil)
845+
assert.NoError(t, err)
846+
_, err = dc.Detach()
847+
assert.ErrorIs(t, err, errDetachBeforeOpened)
848+
assert.NoError(t, offer.Close())
849+
assert.NoError(t, answer.Close())
850+
})
851+
}

0 commit comments

Comments
 (0)