From 22622e91a9c9eb7a83047da3b974f9c7573ff898 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 13 Feb 2019 21:06:19 -0800 Subject: [PATCH] server: detect duplicate channelCreated() calls --- src/server/pv/responseHandlers.h | 1 + src/server/responseHandlers.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/server/pv/responseHandlers.h b/src/server/pv/responseHandlers.h index b8f62b0..305ee7f 100644 --- a/src/server/pv/responseHandlers.h +++ b/src/server/pv/responseHandlers.h @@ -218,6 +218,7 @@ private: const std::string _channelName; const pvAccessID _cid; ChannelSecuritySession::shared_pointer const & _css; + bool _created; epics::pvData::Status _status; epics::pvData::Mutex _mutex; }; diff --git a/src/server/responseHandlers.cpp b/src/server/responseHandlers.cpp index 81412be..a00e3fe 100644 --- a/src/server/responseHandlers.cpp +++ b/src/server/responseHandlers.cpp @@ -792,8 +792,7 @@ ServerChannelRequesterImpl::ServerChannelRequesterImpl(const Transport::shared_p _channelName(channelName), _cid(cid), _css(css), - _status(), - _mutex() + _created(false) { } @@ -811,6 +810,8 @@ ChannelRequester::shared_pointer ServerChannelRequesterImpl::create( void ServerChannelRequesterImpl::channelCreated(const Status& status, Channel::shared_pointer const & channel) { + if(_created) + throw std::logic_error("Channel already created"); if(detail::BlockingServerTCPTransportCodec::shared_pointer transport = _transport.lock()) { ServerChannel::shared_pointer serverChannel; @@ -847,6 +848,7 @@ void ServerChannelRequesterImpl::channelCreated(const Status& status, Channel::s Lock guard(_mutex); _status = status; _serverChannel = serverChannel; + _created = true; } TransportSender::shared_pointer thisSender = shared_from_this(); @@ -891,6 +893,7 @@ void ServerChannelRequesterImpl::channelStateChange(Channel::shared_pointer cons ServerChannel::shared_pointer channel; { Lock guard(_mutex); + _created = false; channel= dynamic_pointer_cast(_serverChannel.lock()); }