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 17:02:12 UTC
[jira] [Assigned] (PROTON-246) Described value at the end of a map
screws up pn_data_appendn() - this screws up link attaches with filters
[ https://issues.apache.org/jira/browse/PROTON-246?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andrew Stitcher reassigned PROTON-246:
--------------------------------------
Assignee: Andrew Stitcher
> 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
> Assignee: 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