Skip to content

Commit b6262ac

Browse files
Add proper synchronization and clean up after #1206
1 parent b756b5a commit b6262ac

File tree

2 files changed

+31
-27
lines changed

2 files changed

+31
-27
lines changed

src/impl/peerconnection.cpp

+23-21
Original file line numberDiff line numberDiff line change
@@ -46,24 +46,22 @@ static LogCounter
4646

4747
const string PemBeginCertificateTag = "-----BEGIN CERTIFICATE-----";
4848

49-
PeerConnection::PeerConnection(Configuration config_)
50-
: config(std::move(config_)) {
49+
PeerConnection::PeerConnection(Configuration config_) : config(std::move(config_)) {
5150
PLOG_VERBOSE << "Creating PeerConnection";
5251

53-
5452
if (config.certificatePemFile && config.keyPemFile) {
5553
std::promise<certificate_ptr> cert;
5654
cert.set_value(std::make_shared<Certificate>(
57-
config.certificatePemFile->find(PemBeginCertificateTag) != string::npos
58-
? Certificate::FromString(*config.certificatePemFile, *config.keyPemFile)
59-
: Certificate::FromFile(*config.certificatePemFile, *config.keyPemFile,
60-
config.keyPemPass.value_or(""))));
55+
config.certificatePemFile->find(PemBeginCertificateTag) != string::npos
56+
? Certificate::FromString(*config.certificatePemFile, *config.keyPemFile)
57+
: Certificate::FromFile(*config.certificatePemFile, *config.keyPemFile,
58+
config.keyPemPass.value_or(""))));
6159
mCertificate = cert.get_future();
6260
} else if (!config.certificatePemFile && !config.keyPemFile) {
6361
mCertificate = make_certificate(config.certificateType);
6462
} else {
6563
throw std::invalid_argument(
66-
"Either none or both certificate and key PEM files must be specified");
64+
"Either none or both certificate and key PEM files must be specified");
6765
}
6866

6967
if (config.portRangeEnd && config.portRangeBegin > config.portRangeEnd)
@@ -229,13 +227,15 @@ shared_ptr<DtlsTransport> PeerConnection::initDtlsTransport() {
229227

230228
PLOG_VERBOSE << "Starting DTLS transport";
231229

232-
auto fingerprintAlgorithm = CertificateFingerprint::Algorithm::Sha256;
233-
if (auto remote = remoteDescription(); remote && remote->fingerprint()) {
234-
fingerprintAlgorithm = remote->fingerprint()->algorithm;
230+
CertificateFingerprint::Algorithm fingerprintAlgorithm;
231+
{
232+
std::lock_guard lock(mRemoteDescription);
233+
if (mRemoteDescription && mRemoteDescription->fingerprint()) {
234+
mRemoteFingerprintAlgorithm = mRemoteDescription->fingerprint()->algorithm;
235+
}
236+
fingerprintAlgorithm = mRemoteFingerprintAlgorithm;
235237
}
236238

237-
mRemoteFingerprintAlgorithm = fingerprintAlgorithm;
238-
239239
auto lower = std::atomic_load(&mIceTransport);
240240
if (!lower)
241241
throw std::logic_error("No underlying ICE transport for DTLS transport");
@@ -443,23 +443,24 @@ void PeerConnection::rollbackLocalDescription() {
443443

444444
bool PeerConnection::checkFingerprint(const std::string &fingerprint) {
445445
std::lock_guard lock(mRemoteDescriptionMutex);
446-
if (!mRemoteDescription || !mRemoteDescription->fingerprint())
446+
mRemoteFingerprint = fingerprint;
447+
448+
if (!mRemoteDescription || !mRemoteDescription->fingerprint() || mRemoteFingerprintAlgorithm != mRemoteDescription->fingerprint()->algorithm)
447449
return false;
448450

449-
if (config.disableFingerprintVerification) {
451+
if (config.disableFingerprintVerification) {
450452
PLOG_VERBOSE << "Skipping fingerprint validation";
451-
mRemoteFingerprint = fingerprint;
452453
return true;
453454
}
454455

455456
auto expectedFingerprint = mRemoteDescription->fingerprint()->value;
456457
if (expectedFingerprint == fingerprint) {
457458
PLOG_VERBOSE << "Valid fingerprint \"" << fingerprint << "\"";
458-
mRemoteFingerprint = fingerprint;
459459
return true;
460460
}
461461

462-
PLOG_ERROR << "Invalid fingerprint \"" << fingerprint << "\", expected \"" << expectedFingerprint << "\"";
462+
PLOG_ERROR << "Invalid fingerprint \"" << fingerprint << "\", expected \""
463+
<< expectedFingerprint << "\"";
463464
return false;
464465
}
465466

@@ -555,7 +556,7 @@ void PeerConnection::forwardMedia([[maybe_unused]] message_ptr message) {
555556
void PeerConnection::dispatchMedia([[maybe_unused]] message_ptr message) {
556557
#if RTC_ENABLE_MEDIA
557558
std::shared_lock lock(mTracksMutex); // read-only
558-
if (mTrackLines.size()==1) {
559+
if (mTrackLines.size() == 1) {
559560
if (auto track = mTrackLines.front().lock())
560561
track->incoming(message);
561562
return;
@@ -742,7 +743,7 @@ void PeerConnection::iterateDataChannels(
742743
{
743744
std::shared_lock lock(mDataChannelsMutex); // read-only
744745
locked.reserve(mDataChannels.size());
745-
for(auto it = mDataChannels.begin(); it != mDataChannels.end(); ++it) {
746+
for (auto it = mDataChannels.begin(); it != mDataChannels.end(); ++it) {
746747
auto channel = it->second.lock();
747748
if (channel && !channel->isClosed())
748749
locked.push_back(std::move(channel));
@@ -811,7 +812,7 @@ void PeerConnection::iterateTracks(std::function<void(shared_ptr<Track> track)>
811812
{
812813
std::shared_lock lock(mTracksMutex); // read-only
813814
locked.reserve(mTrackLines.size());
814-
for(auto it = mTrackLines.begin(); it != mTrackLines.end(); ++it) {
815+
for (auto it = mTrackLines.begin(); it != mTrackLines.end(); ++it) {
815816
auto track = it->lock();
816817
if (track && !track->isClosed())
817818
locked.push_back(std::move(track));
@@ -1308,6 +1309,7 @@ void PeerConnection::resetCallbacks() {
13081309
}
13091310

13101311
CertificateFingerprint PeerConnection::remoteFingerprint() {
1312+
std::lock_guard lock(mRemoteDescriptionMutex);
13111313
if (mRemoteFingerprint)
13121314
return {CertificateFingerprint{mRemoteFingerprintAlgorithm, *mRemoteFingerprint}};
13131315
else

src/impl/peerconnection.hpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ struct PeerConnection : std::enable_shared_from_this<PeerConnection> {
9898
bool changeSignalingState(SignalingState newState);
9999

100100
void resetCallbacks();
101+
101102
CertificateFingerprint remoteFingerprint();
102103

103104
// Helper method for asynchronous callback invocation
@@ -135,12 +136,16 @@ struct PeerConnection : std::enable_shared_from_this<PeerConnection> {
135136
future_certificate_ptr mCertificate;
136137

137138
Processor mProcessor;
138-
optional<Description> mLocalDescription, mRemoteDescription;
139+
optional<Description> mLocalDescription;
139140
optional<Description> mCurrentLocalDescription;
140-
mutable std::mutex mLocalDescriptionMutex, mRemoteDescriptionMutex;
141+
mutable std::mutex mLocalDescriptionMutex;
141142

142-
shared_ptr<MediaHandler> mMediaHandler;
143+
optional<Description> mRemoteDescription;
144+
CertificateFingerprint::Algorithm mRemoteFingerprintAlgorithm = CertificateFingerprint::Algorithm::Sha256;
145+
optional<string> mRemoteFingerprint;
146+
mutable std::mutex mRemoteDescriptionMutex;
143147

148+
shared_ptr<MediaHandler> mMediaHandler;
144149
mutable std::shared_mutex mMediaHandlerMutex;
145150

146151
shared_ptr<IceTransport> mIceTransport;
@@ -158,9 +163,6 @@ struct PeerConnection : std::enable_shared_from_this<PeerConnection> {
158163

159164
Queue<shared_ptr<DataChannel>> mPendingDataChannels;
160165
Queue<shared_ptr<Track>> mPendingTracks;
161-
162-
CertificateFingerprint::Algorithm mRemoteFingerprintAlgorithm = CertificateFingerprint::Algorithm::Sha256;
163-
optional<string> mRemoteFingerprint;
164166
};
165167

166168
} // namespace rtc::impl

0 commit comments

Comments
 (0)