You are viewing a plain text version of this content. The canonical link for it is here.
Posted to proton@qpid.apache.org by "Andrew Stitcher (JIRA)" <ji...@apache.org> on 2013/02/21 16:58:13 UTC

[jira] [Created] (PROTON-246) Described value at the end of a map screws up pn_data_appendn() - this screws up link attaches with filters

Andrew Stitcher created PROTON-246:
--------------------------------------

             Summary: Described value at the end of a map screws up pn_data_appendn() - this screws up link attaches with filters
                 Key: PROTON-246
                 URL: https://issues.apache.org/jira/browse/PROTON-246
             Project: Qpid Proton
          Issue Type: Bug
    Affects Versions: 0.3
            Reporter: Andrew Stitcher


Replication code (in C++):
#include <string>

#include "proton/codec.h"

pn_bytes_t convert(const std::string& s)
{
    pn_bytes_t result;
    result.start = const_cast<char*>(s.data());
    result.size = s.size();
    return result;
}

int main() {
        pn_data_t* filter = pn_data(16);
        pn_data_put_map(filter);
        pn_data_enter(filter);
        pn_data_put_symbol(filter, convert("qpid.selector"));
        pn_data_put_described(filter);
        pn_data_enter(filter);
        pn_data_put_symbol(filter, convert("qpid.apache.org:selector:string"));
        pn_data_put_string(filter, convert("selector-here"));
        pn_data_exit(filter);
        pn_data_exit(filter);
        pn_data_put_symbol(filter, convert("foo"));
        pn_data_put_string(filter, convert("bar"));

        pn_data_dump(filter);
        
        pn_data_t* out = pn_data(16);
        pn_data_t* symbol = pn_data(16);
        pn_data_put_symbol(symbol, convert("booboo"));

        pn_data_fill(out, "CC", filter, symbol);
        
        pn_data_dump(out);
}


This outputs:
{current=7, parent=0}
Node 1: prev=0, next=6, parent=0, down=2, children=2, type=24 (map[0])
Node 2: prev=0, next=3, parent=1, down=0, children=0, type=20 (:"qpid.selector")
Node 3: prev=2, next=0, parent=1, down=4, children=2, type=21 (descriptor)
Node 4: prev=0, next=5, parent=3, down=0, children=0, type=20 (:"qpid.apache.org:selector:string")
Node 5: prev=4, next=0, parent=3, down=0, children=0, type=19 ("selector-here")
Node 6: prev=1, next=7, parent=0, down=0, children=0, type=20 (:foo)
Node 7: prev=6, next=0, parent=0, down=0, children=0, type=19 ("bar")
{current=6, parent=1}
Node 1: prev=0, next=0, parent=0, down=2, children=3, type=24 (map[0])
Node 2: prev=0, next=3, parent=1, down=0, children=0, type=20 (:"qpid.selector")
Node 3: prev=2, next=6, parent=1, down=4, children=2, type=21 (descriptor)
Node 4: prev=0, next=5, parent=3, down=0, children=0, type=20 (:"qpid.apache.org:selector:string")
Node 5: prev=4, next=0, parent=3, down=0, children=0, type=19 ("selector-here")
Node 6: prev=3, next=0, parent=1, down=0, children=0, type=20 (:booboo)

Which is wrong: note that the final node is erroneously a child of the map.

I have traced this behaviour to these lines in pn_data_appendn()
...
    while (!pn_data_next(src)) {
      if (level > 0) {
        pn_data_exit(data);
        pn_data_exit(src);
        level--;
      }

      if (pn_data_next(src)) {
        break;
      } else {
        stop = true;
        break;
      }
    }
...

Where the code is trying to walk up a level at the end of a sublist, but pn_data_next() does something much more complex than merely walking the sublists and so this fails somehow.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira