Uploaded image for project: 'Qpid'
  1. Qpid
  2. QPID-7020

uint16 AMQP0-10 message properties decoded as uint8

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • qpid-cpp-0.34
    • qpid-cpp-1.35.0
    • C++ Broker
    • 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)

      { 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

      Attachments

        Activity

          People

            pmoravec Pavel Moravec
            pmoravec Pavel Moravec
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: