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