From acab4cd4082f3730c261e2d3d42d404a5148bdf7 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 8 Mar 2018 11:42:56 -0500 Subject: [PATCH] fix potential *NULL from Get2PutProxy --- src/client/pvAccess.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/client/pvAccess.cpp b/src/client/pvAccess.cpp index 3238b9d..e78f740 100644 --- a/src/client/pvAccess.cpp +++ b/src/client/pvAccess.cpp @@ -259,19 +259,39 @@ struct Get2PutProxy : public ChannelGet ChannelPut::shared_pointer op; // the put we wrap std::tr1::shared_ptr op_request; // keep our Req alive + ChannelPut::shared_pointer OP() { + epicsGuard G(op_request->mutex); + return op; + } + Get2PutProxy() {} virtual ~Get2PutProxy() {} virtual void destroy() OVERRIDE FINAL - { op->destroy(); } + { + ChannelPut::shared_pointer O(OP()); + if(O) O->destroy(); + } virtual std::tr1::shared_ptr getChannel() OVERRIDE FINAL - { return op->getChannel(); } + { + ChannelPut::shared_pointer O(OP()); + return O ? O->getChannel() : std::tr1::shared_ptr(); + } virtual void cancel() OVERRIDE FINAL - { op->cancel(); } + { + ChannelPut::shared_pointer O(OP()); + if(O) O->cancel(); + } virtual void lastRequest() OVERRIDE FINAL - { op->lastRequest(); } + { + ChannelPut::shared_pointer O(OP()); + if(O) O->lastRequest(); + } virtual void get() OVERRIDE FINAL - { op->get(); } + { + ChannelPut::shared_pointer O(OP()); + if(O) O->get(); + } }; }// namespace