Uploaded image for project: 'Qpid Proton'
  1. Qpid Proton
  2. PROTON-2244

[Proton-c] Encoder error for array of lists where first list in array is empty

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • proton-c-0.32.0
    • proton-c
    • None

    Description

      AMQP encodes arrays with a single element constructor which should be identical for all elements in the array. However, if an array of lists is constructed in which the first list is empty, then the AMQP empty list constructor is used in the array, and the following lists which may be non-empty, will not be decoded correctly.

      >>> import proton
      >>> a = proton.Array(proton.UNDESCRIBED, proton.Data.LIST, [], [1,2,3], ['aaa', 'bbb', 'ccc'])
      >>> d1 = proton.Data()
      >>> d1.put_py_array(a)
      >>> d1.encode().hex()
      'f00000002a00000003450000000a000000035501550255030000001300000003a103616161a103626262a103636363'
      

      which, when broken down into parts, looks as follows:

      f0 000002a 00000003 45 <-- Array constructor, size=0x2a, len=3, type=empty list
                          ^^--- Empty list constructor
      0000000a 00000003 5501 5502 5503 <- data for [1,2,3]
      00000013 00000003 a103616161 a103626262 a103636363 <-- data for ['aaa', 'bbb', 'ccc']
      

      When decoded, this is being interpreted as an array of empty lists:

      >>> d2 = proton.Data()
      >>> d2.decode(d1.encode())
      10
      >>> d2.get_py_array()
      Array(UNDESCRIBED, 24, [], [], [])
      

      When a mis-encoded array is used in the body of a message and is decoded, an error results:

      >>> import proton
      >>> a = proton.Array(proton.UNDESCRIBED, proton.Data.LIST, [], [1,2,3], ['aaa', 'bbb', 'ccc'])
      >>> m1 = proton.Message(body=a)
      >>> m1
      Message(priority=4, body=Array(UNDESCRIBED, 24, [], [1, 2, 3], ['aaa', 'bbb', 'ccc']))
      >>> m2 = proton.Message()
      >>> m2.decode(m1.encode())
      Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
       File "/home/kvdr/RedHat/install/lib64/proton/bindings/python3/proton/_message.py", line 488, in decode
       self._check(pn_message_decode(self._msg, data))
       File "/home/kvdr/RedHat/install/lib64/proton/bindings/python3/proton/_message.py", line 87, in _check
       raise exc("[%s]: %s" % (err, pn_error_text(pn_message_error(self._msg))))
      proton._exceptions.MessageException: [-6]: data error: (null)
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            kpvdr Kim van der Riet
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: