Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 648711 Details for
Bug 877081
Broker crash re-routing messages through a header exchange
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Quick patch to prevent this crash
bz877081.patch (text/plain), 8.01 KB, created by
Jason Dillaman
on 2012-11-20 18:10:14 UTC
(
hide
)
Description:
Quick patch to prevent this crash
Filename:
MIME Type:
Creator:
Jason Dillaman
Created:
2012-11-20 18:10:14 UTC
Size:
8.01 KB
patch
obsolete
>diff --git a/qpid/cpp/src/qpid/broker/HeadersExchange.cpp b/qpid/cpp/src/qpid/broker/HeadersExchange.cpp >index 9975d26..ee69f7c 100644 >--- a/qpid/cpp/src/qpid/broker/HeadersExchange.cpp >+++ b/qpid/cpp/src/qpid/broker/HeadersExchange.cpp >@@ -196,8 +196,7 @@ bool HeadersExchange::unbind(Queue::shared_ptr queue, const string& bindingKey, > > void HeadersExchange::route(Deliverable& msg) > { >- const FieldTable* args = msg.getMessage().getApplicationHeaders(); >- if (!args) { >+ if (!msg.getMessage().getApplicationHeaders()) { > //can't match if there were no headers passed in > if (mgmtExchange != 0) { > mgmtExchange->inc_msgReceives(); >@@ -216,7 +215,7 @@ void HeadersExchange::route(Deliverable& msg) > Bindings::ConstPtr p = bindings.snapshot(); > if (p.get()) { > for (std::vector<BoundKey>::const_iterator i = p->begin(); i != p->end(); ++i) { >- if (match((*i).binding->args, *args)) { >+ if (match((*i).binding->args, msg.getMessage())) { > b->push_back((*i).binding); > } > } >@@ -272,7 +271,7 @@ namespace > } > > >-bool HeadersExchange::match(const FieldTable& bind, const FieldTable& msg) { >+bool HeadersExchange::match(const FieldTable& bind, const Message& message) { > typedef FieldTable::ValueMap Map; > std::string what = getMatch(&bind); > if (what == all) { >@@ -282,9 +281,9 @@ bool HeadersExchange::match(const FieldTable& bind, const FieldTable& msg) { > { > if (i->first != x_match) > { >- Map::const_iterator j = msg.find(i->first); >- if (j == msg.end()) return false; >- if (!match_values(*(i->second), *(j->second))) return false; >+ framing::FieldTable::ValuePtr value = message.getApplicationHeader(i->first); >+ if (!value) return false; >+ if (!match_values(*(i->second), *value)) return false; > } > } > return true; >@@ -295,9 +294,9 @@ bool HeadersExchange::match(const FieldTable& bind, const FieldTable& msg) { > { > if (i->first != x_match) > { >- Map::const_iterator j = msg.find(i->first); >- if (j != msg.end()) { >- if (match_values(*(i->second), *(j->second))) return true; >+ framing::FieldTable::ValuePtr value = message.getApplicationHeader(i->first); >+ if (value) { >+ if (match_values(*(i->second), *value)) return true; > } > } > } >diff --git a/qpid/cpp/src/qpid/broker/HeadersExchange.h b/qpid/cpp/src/qpid/broker/HeadersExchange.h >index d10892b..9389518 100644 >--- a/qpid/cpp/src/qpid/broker/HeadersExchange.h >+++ b/qpid/cpp/src/qpid/broker/HeadersExchange.h >@@ -108,7 +108,7 @@ class HeadersExchange : public virtual Exchange { > > virtual bool supportsDynamicBinding() { return true; } > >- static QPID_BROKER_EXTERN bool match(const qpid::framing::FieldTable& bindArgs, const qpid::framing::FieldTable& msgArgs); >+ static QPID_BROKER_EXTERN bool match(const qpid::framing::FieldTable& bindArgs, const Message& message); > static bool equal(const qpid::framing::FieldTable& bindArgs, const qpid::framing::FieldTable& msgArgs); > }; > >diff --git a/qpid/cpp/src/tests/ExchangeTest.cpp b/qpid/cpp/src/tests/ExchangeTest.cpp >index 66a16b9..86bba69 100644 >--- a/qpid/cpp/src/tests/ExchangeTest.cpp >:Traceback (most recent call last): > File "/home/jdillaman/.gnome2/gedit/plugins/autocomplete.py", line 566, in on_window_tab_added > self.tip.set_font_description(font_desc) >AttributeError: 'NoneType' object has no attribute 'set_font_description' >+++ b/qpid/cpp/src/tests/ExchangeTest.cpp >@@ -273,7 +273,7 @@ QPID_AUTO_TEST_CASE(testIVEOption) > Queue::shared_ptr queue2(new Queue("queue2", true)); > Queue::shared_ptr queue3(new Queue("queue3", true)); > >- BOOST_CHECK(HeadersExchange::match(args2, msg1->getProperties<MessageProperties>()->getApplicationHeaders())); >+ BOOST_CHECK(HeadersExchange::match(args2, *msg1)); > > BOOST_CHECK(direct.bind(queue, "abc", 0)); > BOOST_CHECK(fanout.bind(queue1, "abc", 0)); >diff --git a/qpid/cpp/src/tests/HeadersExchangeTest.cpp b/qpid/cpp/src/tests/HeadersExchangeTest.cpp >index 40deb59..8002d26 100644 >--- a/qpid/cpp/src/tests/HeadersExchangeTest.cpp >+++ b/qpid/cpp/src/tests/HeadersExchangeTest.cpp >@@ -24,6 +24,7 @@ > #include "qpid/framing/FieldTable.h" > #include "qpid/framing/FieldValue.h" > #include "unit_test.h" >+#include "MessageUtils.h" > > using namespace qpid::broker; > using namespace qpid::framing; >@@ -35,70 +36,79 @@ QPID_AUTO_TEST_SUITE(HeadersExchangeTestSuite) > > QPID_AUTO_TEST_CASE(testMatchAll) > { >- FieldTable b, m, n; >+ FieldTable b; > b.setString("x-match", "all"); > b.setString("foo", "FOO"); >- b.setInt("n", 42); >- m.setString("foo", "FOO"); >- m.setInt("n", 42); >- BOOST_CHECK(HeadersExchange::match(b, m)); >+ b.setInt64("n", 42); >+ >+ boost::intrusive_ptr<Message> m = MessageUtils::createMessage(); >+ m->insertCustomProperty("foo", "FOO"); >+ m->insertCustomProperty("n", 42); >+ BOOST_CHECK(HeadersExchange::match(b, *m)); > > // Ignore extras. >- m.setString("extra", "x"); >- BOOST_CHECK(HeadersExchange::match(b, m)); >+ m->insertCustomProperty("extra", "x"); >+ BOOST_CHECK(HeadersExchange::match(b, *m)); > > // Fail mismatch, wrong value. >- m.setString("foo", "NotFoo"); >- BOOST_CHECK(!HeadersExchange::match(b, m)); >+ m->insertCustomProperty("foo", "NotFoo"); >+ BOOST_CHECK(!HeadersExchange::match(b, *m)); > > // Fail mismatch, missing value >- n.setInt("n", 42); >- n.setString("extra", "x"); >- BOOST_CHECK(!HeadersExchange::match(b, n)); >+ boost::intrusive_ptr<Message> n = MessageUtils::createMessage(); >+ n->insertCustomProperty("n", 42); >+ n->insertCustomProperty("extra", "x"); >+ BOOST_CHECK(!HeadersExchange::match(b, *n)); > } > > QPID_AUTO_TEST_CASE(testMatchAny) > { >- FieldTable b, m, n; >+ FieldTable b; > b.setString("x-match", "any"); > b.setString("foo", "FOO"); >- b.setInt("n", 42); >- m.setString("foo", "FOO"); >- BOOST_CHECK(!HeadersExchange::match(b, n)); >- BOOST_CHECK(HeadersExchange::match(b, m)); >- m.setInt("n", 42); >- BOOST_CHECK(HeadersExchange::match(b, m)); >+ b.setInt64("n", 42); >+ >+ boost::intrusive_ptr<Message> m = MessageUtils::createMessage(); >+ boost::intrusive_ptr<Message> n = MessageUtils::createMessage(); >+ m->insertCustomProperty("foo", "FOO"); >+ BOOST_CHECK(!HeadersExchange::match(b, *n)); >+ BOOST_CHECK(HeadersExchange::match(b, *m)); >+ m->insertCustomProperty("n", 42); >+ BOOST_CHECK(HeadersExchange::match(b, *m)); > } > > QPID_AUTO_TEST_CASE(testMatchEmptyValue) > { >- FieldTable b, m; >+ FieldTable b; > b.setString("x-match", "all"); > b.set("foo", FieldTable::ValuePtr()); > b.set("n", FieldTable::ValuePtr()); >- BOOST_CHECK(!HeadersExchange::match(b, m)); >- m.setString("foo", "blah"); >- m.setInt("n", 123); >+ boost::intrusive_ptr<Message> m = MessageUtils::createMessage(); >+ BOOST_CHECK(!HeadersExchange::match(b, *m)); >+ m->insertCustomProperty("foo", "blah"); >+ m->insertCustomProperty("n", 123); > } > > QPID_AUTO_TEST_CASE(testMatchEmptyArgs) > { >- FieldTable b, m; >- m.setString("foo", "FOO"); >+ FieldTable b; >+ boost::intrusive_ptr<Message> m = MessageUtils::createMessage(); >+ m->insertCustomProperty("foo", "FOO"); > > b.setString("x-match", "all"); >- BOOST_CHECK(HeadersExchange::match(b, m)); >+ BOOST_CHECK(HeadersExchange::match(b, *m)); > b.setString("x-match", "any"); >- BOOST_CHECK(!HeadersExchange::match(b, m)); >+ BOOST_CHECK(!HeadersExchange::match(b, *m)); > } > > > QPID_AUTO_TEST_CASE(testMatchNoXMatch) > { >- FieldTable b, m; >+ FieldTable b; > b.setString("foo", "FOO"); >- m.setString("foo", "FOO"); >- BOOST_CHECK(!HeadersExchange::match(b, m)); >+ boost::intrusive_ptr<Message> m = MessageUtils::createMessage(); >+ m->insertCustomProperty("foo", "FOO"); >+ BOOST_CHECK(!HeadersExchange::match(b, *m)); > } > > QPID_AUTO_TEST_CASE(testBindNoXMatch)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 877081
: 648711