Skip to content

Demarshaling messages with zero-length arrays fails #14

@albel727

Description

@albel727

When a message signature contains an array, but the message body actually contains no elements, parsing incorrectly fails with DemarshalError::MismatchedParens, due to invalid handling in

let mut sig_copy = "".to_owned();
while *offset < start_offset+(array_len as usize) {
// We want to pass the same signature to each call of demarshal
sig_copy = sig.to_owned();
vec.push(try!(demarshal(buf, offset, &mut sig_copy)));
}
// Now that we're done with our elements we can forget the elements consumed by demarshal
let mut mysig = sig.clone();
mysig.truncate(sig.len() - sig_copy.len());
mysig.insert(0, 'a');
*sig = sig_copy;

Note that if the while loop doesn't execute even once, sig_copy will remain empty, and the currently parsed sig will be unconditionally emptied, instead of being set to fields remaining to be parsed.

Maybe I'll fix the bug myself later and publish a PR, but meanwhile here's an example failing test case with an array in the middle of a simple struct. Both nonempty and empty array tests are added for contrast.

albel727@460d6c1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions