| Summary: | uint16 message properties decoded as uint8 | |||
|---|---|---|---|---|
| Product: | Red Hat Enterprise MRG | Reporter: | Pavel Moravec <pmoravec> | |
| Component: | qpid-cpp | Assignee: | messaging-bugs <messaging-bugs> | |
| Status: | CLOSED ERRATA | QA Contact: | Zdenek Kraus <zkraus> | |
| Severity: | high | Docs Contact: | ||
| Priority: | urgent | |||
| Version: | Development | CC: | esammons, jross, mcressma, ngalvin, pematous, psvobodo, zkraus | |
| Target Milestone: | 3.2.1 | |||
| Target Release: | --- | |||
| Hardware: | All | |||
| OS: | Linux | |||
| Whiteboard: | ||||
| Fixed In Version: | qpid-cpp-0.34-6.el6 | Doc Type: | Bug Fix | |
| Doc Text: | Story Points: | --- | ||
| Clone Of: | ||||
| : | 1308695 (view as bug list) | Environment: | ||
| Last Closed: | 2016-03-14 14:53:42 UTC | Type: | Bug | |
| Regression: | --- | Mount Type: | --- | |
| Documentation: | --- | CRM: | ||
| Verified Versions: | Category: | --- | ||
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | ||
| Cloudforms Team: | --- | Target Upstream Version: | ||
| Bug Depends On: | ||||
| Bug Blocks: | 1308695 | |||
posted to upstream as r1726487. This fix was tested on RHEL 6 i686 && x86_64 with following packages: qpid-cpp-client-0.34-6 qpid-cpp-client-devel-0.34-6 qpid-cpp-client-devel-docs-0.34-6 qpid-cpp-client-rdma-0.34-6 qpid-cpp-debuginfo-0.34-6 qpid-cpp-server-0.34-6 qpid-cpp-server-devel-0.34-6 qpid-cpp-server-ha-0.34-6 qpid-cpp-server-linearstore-0.34-6 qpid-cpp-server-rdma-0.34-6 qpid-cpp-server-xml-0.34-6 qpid-proton-c-0.10-2 This fix works as expected. ->VERIFIED Verified also on Rhel 6 x86_64 and i686 and Rhel 7 x86_64 with qpid-cpp-0.34-7 on broker side and C++ client from qpid-cpp-win-3.34.4.1-1. Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://rhn.redhat.com/errata/RHBA-2016-0443.html |
Description of problem: MessageTransfer::processProperties has trivial typo in decoding uin16 message property type as uint8 variant: void MessageTransfer::processProperties(qpid::amqp::MapHandler& handler) const { .. switch (v.getType()) { case qpid::types::VAR_VOID: handler.handleVoid(key); break; case qpid::types::VAR_BOOL: handler.handleBool(key, v); break; case qpid::types::VAR_UINT8: handler.handleUint8(key, v); break; case qpid::types::VAR_UINT16: handler.handleUint8(key, v); break; .. See the latest line. Any attempt to call that line raises error: invalid conversion: Cannot convert from uint16 to uint8 (/builddir/build/BUILD/qpid-cpp-0.34/src/qpid/types/Variant.cpp:280) One reproducer provided below. Version-Release number of selected component (if applicable): qpid-cpp-server-0.34-5.el6.x86_64 How reproducible: 100% Steps to Reproduce: 1. Have this trivial program that creates queue message_queue, subscribes to the queue, bind to amq.match with x-match:any,number:10809 matcher rule: $ cat send_uint16_t.cpp #include <qpid/messaging/Connection.h> #include <qpid/messaging/Message.h> #include <qpid/messaging/Receiver.h> #include <qpid/messaging/Sender.h> #include <qpid/messaging/Session.h> #include <cstdlib> #include <iostream> #include <sstream> using namespace qpid::messaging; using namespace qpid::types; using std::stringstream; using std::string; int main(int argc, char** argv) { const char* url = argc>1 ? argv[1] : "amqp:tcp:127.0.0.1:5672"; Connection connection(url, ""); try { connection.open(); Session session = connection.createSession(); Receiver receiver = session.createReceiver("message_queue; {create: always, node:{type:queue, durable:false, x-bindings:[{exchange:'amq.match', queue:'message_queue', key:'key', arguments:{x-match:any,number:10809}}]}}"); Sender sender = session.createSender("amq.match/key"); Message msg("Some content"); uint16_t number=10809; msg.setProperty("number", number); sender.send(msg); Message msg2 = receiver.fetch(); std::cout << "Properties: " << msg2.getProperties() << std::endl << "Content: " << msg.getContent() << std::endl; session.close(); connection.close(); return 0; } catch(const std::exception& error) { std::cout << error.what() << std::endl; connection.close(); } return 1; } 2. Compile it and run against a broker: g++ -Wall -lqpidclient -lqpidcommon -lqpidmessaging -lqpidtypes send_uint16_t.cpp -o send_uint16_t ./send_uint16_t 3. Check output and also qpid logs Actual results: output: 2016-01-24 13:46:30 [Client] warning Broker closed connection: 501, invalid conversion: Cannot convert from uint16 to uint8 (/builddir/build/BUILD/qpid-cpp-0.34/src/qpid/types/Variant.cpp:280) framing-error: invalid conversion: Cannot convert from uint16 to uint8 (/builddir/build/BUILD/qpid-cpp-0.34/src/qpid/types/Variant.cpp:280) qpid error: 2016-01-24 13:46:30 [Broker] error Connection exception: framing-error: invalid conversion: Cannot convert from uint16 to uint8 (/builddir/build/BUILD/qpid-cpp-0.34/src/qpid/types/Variant.cpp:280) 2016-01-24 13:46:30 [Protocol] error Connection qpid.127.0.0.1:5672-127.0.0.1:33825 closed by error: invalid conversion: Cannot convert from uint16 to uint8 (/builddir/build/BUILD/qpid-cpp-0.34/src/qpid/types/Variant.cpp:280)(501) Expected results: output: a message is received and printed to stdout qpid logs: no error Additional info: will commit the fix to upstream