Pavel Moravec created QPID-7020: ----------------------------------- Summary: uint16 AMQP0-10 message properties decoded as uint8 Key: QPID-7020 URL: https://issues.apache.org/jira/browse/QPID-7020 Project: Qpid Issue Type: Bug Components: C++ Broker Affects Versions: qpid-cpp-0.34 Reporter: Pavel Moravec
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 -- This message was sent by Atlassian JIRA (v6.3.4#6332) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org For additional commands, e-mail: dev-h...@qpid.apache.org