From 2e987bf2b0c3f9318b28c79186a35f338c90ee6c Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Thu, 6 Nov 2008 13:30:27 +0000 Subject: QPID-1417: ensure there are no dangling pointers in a connections output tasks git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@711855 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/broker/Connection.cpp | 2 ++ cpp/src/qpid/sys/AggregateOutput.cpp | 5 +++++ cpp/src/qpid/sys/AggregateOutput.h | 1 + 3 files changed, 8 insertions(+) (limited to 'cpp/src/qpid') diff --git a/cpp/src/qpid/broker/Connection.cpp b/cpp/src/qpid/broker/Connection.cpp index 47ad8f74b7..28ab6cbf1b 100644 --- a/cpp/src/qpid/broker/Connection.cpp +++ b/cpp/src/qpid/broker/Connection.cpp @@ -169,6 +169,8 @@ void Connection::close( { QPID_LOG_IF(error, code != 200, "Connection " << mgmtId << " closed by error: " << text << "(" << code << ")"); adapter.close(code, text, classId, methodId); + //make sure we delete dangling pointers from outputTasks before deleting sessions + outputTasks.removeAll(); channels.clear(); getOutput().close(); } diff --git a/cpp/src/qpid/sys/AggregateOutput.cpp b/cpp/src/qpid/sys/AggregateOutput.cpp index 2fad28c381..d2c4b7185e 100644 --- a/cpp/src/qpid/sys/AggregateOutput.cpp +++ b/cpp/src/qpid/sys/AggregateOutput.cpp @@ -65,4 +65,9 @@ void AggregateOutput::removeOutputTask(OutputTask* t) if (i != tasks.end()) tasks.erase(i); } +void AggregateOutput::removeAll() +{ + tasks.clear(); +} + }} // namespace qpid::sys diff --git a/cpp/src/qpid/sys/AggregateOutput.h b/cpp/src/qpid/sys/AggregateOutput.h index 0b08cd6f5f..9655e28c6a 100644 --- a/cpp/src/qpid/sys/AggregateOutput.h +++ b/cpp/src/qpid/sys/AggregateOutput.h @@ -48,6 +48,7 @@ namespace sys { bool hasOutput(); void addOutputTask(OutputTask* t); void removeOutputTask(OutputTask* t); + void removeAll(); /** Apply f to each OutputTask* in the tasks list */ template void eachOutput(F f) { -- cgit v1.2.1