Skip to content

Commit 7f3ceec

Browse files
Add proper synchronization to remote fingerprint after #1206
1 parent b756b5a commit 7f3ceec

File tree

2 files changed

+23
-21
lines changed

2 files changed

+23
-21
lines changed

src/impl/peerconnection.cpp

+15-15
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)
@@ -443,23 +441,24 @@ void PeerConnection::rollbackLocalDescription() {
443441

444442
bool PeerConnection::checkFingerprint(const std::string &fingerprint) {
445443
std::lock_guard lock(mRemoteDescriptionMutex);
444+
mRemoteFingerprint = fingerprint;
445+
446446
if (!mRemoteDescription || !mRemoteDescription->fingerprint())
447447
return false;
448448

449-
if (config.disableFingerprintVerification) {
449+
if (config.disableFingerprintVerification) {
450450
PLOG_VERBOSE << "Skipping fingerprint validation";
451-
mRemoteFingerprint = fingerprint;
452451
return true;
453452
}
454453

455454
auto expectedFingerprint = mRemoteDescription->fingerprint()->value;
456455
if (expectedFingerprint == fingerprint) {
457456
PLOG_VERBOSE << "Valid fingerprint \"" << fingerprint << "\"";
458-
mRemoteFingerprint = fingerprint;
459457
return true;
460458
}
461459

462-
PLOG_ERROR << "Invalid fingerprint \"" << fingerprint << "\", expected \"" << expectedFingerprint << "\"";
460+
PLOG_ERROR << "Invalid fingerprint \"" << fingerprint << "\", expected \""
461+
<< expectedFingerprint << "\"";
463462
return false;
464463
}
465464

@@ -555,7 +554,7 @@ void PeerConnection::forwardMedia([[maybe_unused]] message_ptr message) {
555554
void PeerConnection::dispatchMedia([[maybe_unused]] message_ptr message) {
556555
#if RTC_ENABLE_MEDIA
557556
std::shared_lock lock(mTracksMutex); // read-only
558-
if (mTrackLines.size()==1) {
557+
if (mTrackLines.size() == 1) {
559558
if (auto track = mTrackLines.front().lock())
560559
track->incoming(message);
561560
return;
@@ -742,7 +741,7 @@ void PeerConnection::iterateDataChannels(
742741
{
743742
std::shared_lock lock(mDataChannelsMutex); // read-only
744743
locked.reserve(mDataChannels.size());
745-
for(auto it = mDataChannels.begin(); it != mDataChannels.end(); ++it) {
744+
for (auto it = mDataChannels.begin(); it != mDataChannels.end(); ++it) {
746745
auto channel = it->second.lock();
747746
if (channel && !channel->isClosed())
748747
locked.push_back(std::move(channel));
@@ -811,7 +810,7 @@ void PeerConnection::iterateTracks(std::function<void(shared_ptr<Track> track)>
811810
{
812811
std::shared_lock lock(mTracksMutex); // read-only
813812
locked.reserve(mTrackLines.size());
814-
for(auto it = mTrackLines.begin(); it != mTrackLines.end(); ++it) {
813+
for (auto it = mTrackLines.begin(); it != mTrackLines.end(); ++it) {
815814
auto track = it->lock();
816815
if (track && !track->isClosed())
817816
locked.push_back(std::move(track));
@@ -1308,6 +1307,7 @@ void PeerConnection::resetCallbacks() {
13081307
}
13091308

13101309
CertificateFingerprint PeerConnection::remoteFingerprint() {
1310+
std::lock_guard lock(mRemoteDescriptionMutex);
13111311
if (mRemoteFingerprint)
13121312
return {CertificateFingerprint{mRemoteFingerprintAlgorithm, *mRemoteFingerprint}};
13131313
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)