segfault fixed when data is unpacked using list_hook,

this bug is a twin to #28.
Unit-test is also attached.
This commit is contained in:
Alexei Romanoff 2012-10-12 13:19:53 +03:00
parent 4ea952f39d
commit cf89f18be7
3 changed files with 11 additions and 1 deletions

View file

@ -163,6 +163,8 @@ static inline int template_callback_array_end(unpack_user* u, msgpack_unpack_obj
{
if (u->list_hook) {
PyObject *new_c = PyEval_CallFunction(u->list_hook, "(O)", *c);
if (!new_c)
return -1;
Py_DECREF(*c);
*c = new_c;
}

View file

@ -347,7 +347,7 @@ _push:
if(construct_cb(_array_item)(user, c->count, &c->obj, obj) < 0) { goto _failed; }
if(++c->count == c->size) {
obj = c->obj;
construct_cb(_array_end)(user, &obj);
if (construct_cb(_array_end)(user, &obj) < 0) { goto _failed; }
--top;
/*printf("stack pop %d\n", top);*/
goto _push;

View file

@ -62,5 +62,13 @@ def test_an_exception_in_objecthook1():
packed = packb({1: {'__complex__': True, 'real': 1, 'imag': 2}})
unpackb(packed, object_hook=bad_complex_decoder)
@raises(DecodeError)
def test_an_exception_in_objecthook2():
packed = packb({1: [{'__complex__': True, 'real': 1, 'imag': 2}]})
unpackb(packed, list_hook=bad_complex_decoder, use_list=1)
if __name__ == '__main__':
main()