From 66f0df692fe7efa0a64393096d3a03bf450e6750 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Wed, 6 Aug 2014 17:11:56 +0000 Subject: QPID-5948: prevent creation of durable topic backed by non-durable exchange; add exception handling to object recovery. (Based on patch from Kim van der Riet). git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1616287 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/qpid/broker/ObjectFactory.cpp | 7 ++++++- qpid/cpp/src/qpid/broker/amqp/Topic.cpp | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/qpid/cpp/src/qpid/broker/ObjectFactory.cpp b/qpid/cpp/src/qpid/broker/ObjectFactory.cpp index 2dd182c428..39edaa9fab 100644 --- a/qpid/cpp/src/qpid/broker/ObjectFactory.cpp +++ b/qpid/cpp/src/qpid/broker/ObjectFactory.cpp @@ -20,6 +20,7 @@ */ #include "ObjectFactory.h" #include "Broker.h" +#include "qpid/log/Statement.h" namespace qpid { namespace broker { @@ -49,7 +50,11 @@ bool ObjectFactoryRegistry::recoverObject(Broker& broker, const std::string& typ { for (Factories::iterator i = factories.begin(); i != factories.end(); ++i) { - if ((*i)->recoverObject(broker, type, name, properties, persistenceId)) return true; + try { + if ((*i)->recoverObject(broker, type, name, properties, persistenceId)) return true; + } catch (const std::exception& e) { + QPID_LOG(warning, "Error while recovering object " << name << " of type " << type << ": " << e.what()); + } } return false; } diff --git a/qpid/cpp/src/qpid/broker/amqp/Topic.cpp b/qpid/cpp/src/qpid/broker/amqp/Topic.cpp index ec0fc617b6..93f4b83f08 100644 --- a/qpid/cpp/src/qpid/broker/amqp/Topic.cpp +++ b/qpid/cpp/src/qpid/broker/amqp/Topic.cpp @@ -63,6 +63,7 @@ Topic::Topic(Broker& broker, const std::string& n, boost::shared_ptr e alternateExchange(getProperty(ALTERNATE_EXCHANGE, properties)) { if (exchange->getName().empty()) throw qpid::Exception("Exchange must be specified."); + if (durable && !exchange->isDurable()) throw qpid::Exception("Durable topic must be backed by durable exchange"); qpid::types::Variant::Map unused; qpid::types::Variant::Map filtered = filter(properties, true); -- cgit v1.2.1