Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
qpid-cpp-0.34
-
None
Description
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)
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