diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 7ae7943e..f7bc83e9 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Setup Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version: '3.x' cache: "pip" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 67c5e52e..9049b469 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,7 +29,7 @@ jobs: uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version: ${{ matrix.py }} allow-prereleases: true diff --git a/.github/workflows/test_debug.yml b/.github/workflows/test_debug.yml index 0cfb2006..4642a85c 100644 --- a/.github/workflows/test_debug.yml +++ b/.github/workflows/test_debug.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: /opt/python-debug key: python-debug-${{ runner.os }}-${{ env.PYTHON_VERSION }} diff --git a/.github/workflows/wheel.yml b/.github/workflows/wheel.yml index 8234ab4e..0e95e092 100644 --- a/.github/workflows/wheel.yml +++ b/.github/workflows/wheel.yml @@ -27,7 +27,7 @@ jobs: steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version: "3.x" cache: "pip" diff --git a/msgpack/_unpacker.pyx b/msgpack/_unpacker.pyx index f758c0c4..e0463617 100644 --- a/msgpack/_unpacker.pyx +++ b/msgpack/_unpacker.pyx @@ -46,7 +46,7 @@ cdef extern from "unpack.h": Py_ssize_t count ctypedef int (*execute_fn)(unpack_context* ctx, const char* data, - Py_ssize_t len, Py_ssize_t* off) except? -1 + Py_ssize_t len, Py_ssize_t* off) except -1 execute_fn unpack_construct execute_fn unpack_skip execute_fn read_array_header @@ -206,8 +206,6 @@ def unpackb(object packed, *, object object_hook=None, object list_hook=None, raise FormatError elif ret == -3: raise StackError - elif PyErr_Occurred(): - raise else: raise ValueError("Unpack failed: error = %d" % (ret,)) @@ -502,8 +500,6 @@ cdef class Unpacker: raise FormatError elif ret == -3: raise StackError - elif PyErr_Occurred(): - raise else: raise ValueError("Unpack failed: error = %d" % (ret,)) finally: diff --git a/msgpack/unpack.h b/msgpack/unpack.h index 55cfdab9..eb4330ac 100644 --- a/msgpack/unpack.h +++ b/msgpack/unpack.h @@ -40,11 +40,6 @@ struct unpack_context; typedef struct unpack_context unpack_context; typedef int (*execute_fn)(unpack_context *ctx, const char* data, Py_ssize_t len, Py_ssize_t* off); -static inline msgpack_unpack_object unpack_callback_root(unpack_user* u) -{ - return NULL; -} - static inline int unpack_callback_uint16(unpack_user* u, uint16_t d, msgpack_unpack_object* o) { PyObject *p = PyLong_FromLong((long)d); diff --git a/msgpack/unpack_template.h b/msgpack/unpack_template.h index ab5887ae..797a2f91 100644 --- a/msgpack/unpack_template.h +++ b/msgpack/unpack_template.h @@ -35,11 +35,6 @@ struct unpack_context { unsigned int cs; unsigned int trail; unsigned int top; - /* - unpack_stack* stack; - unsigned int stack_size; - unpack_stack embed_stack[MSGPACK_EMBED_STACK_SIZE]; - */ unpack_stack stack[MSGPACK_EMBED_STACK_SIZE]; }; @@ -49,22 +44,9 @@ static inline void unpack_init(unpack_context* ctx) ctx->cs = CS_HEADER; ctx->trail = 0; ctx->top = 0; - /* - ctx->stack = ctx->embed_stack; - ctx->stack_size = MSGPACK_EMBED_STACK_SIZE; - */ - ctx->stack[0].obj = unpack_callback_root(&ctx->user); + ctx->stack[0].obj = NULL; } -/* -static inline void unpack_destroy(unpack_context* ctx) -{ - if(ctx->stack_size != MSGPACK_EMBED_STACK_SIZE) { - free(ctx->stack); - } -} -*/ - static inline PyObject* unpack_data(unpack_context* ctx) { return (ctx)->stack[0].obj; @@ -94,9 +76,6 @@ static inline int unpack_execute(bool construct, unpack_context* ctx, const char unsigned int cs = ctx->cs; unsigned int top = ctx->top; unpack_stack* stack = ctx->stack; - /* - unsigned int stack_size = ctx->stack_size; - */ unpack_user* user = &ctx->user; PyObject* obj = NULL; @@ -319,6 +298,7 @@ static inline int unpack_execute(bool construct, unpack_context* ctx, const char start_container(_map, _msgpack_load32(uint32_t,n), CT_MAP_KEY); default: + PyErr_Format(PyExc_RuntimeError, "Invalid state: %d", cs); goto _failed; } } @@ -355,6 +335,7 @@ static inline int unpack_execute(bool construct, unpack_context* ctx, const char goto _header_again; default: + PyErr_Format(PyExc_RuntimeError, "Invalid container type: %u", c->ct); goto _failed; } diff --git a/test/test_unpack.py b/test/test_unpack.py index 81bc976b..ae6ea10c 100644 --- a/test/test_unpack.py +++ b/test/test_unpack.py @@ -5,7 +5,15 @@ from pytest import mark, raises -from msgpack import ExtType, OutOfData, Unpacker, packb +from msgpack import ( + ExtraData, + ExtType, + OutOfData, + Unpacker, + packb, + unpack, + unpackb, +) def test_unpack_array_header_from_file(): @@ -142,3 +150,20 @@ def ext_hook(code, data): up.feed(b"\xdc" + struct.pack(">H", 11) + b"\xd4\x05A" + b"\x2a" * 10) with raises(RuntimeError): up.unpack() + + +def test_unpackb_raises_extra_data_with_trailing_bytes(): + packed = packb(42) + packb("trailing") + with raises(ExtraData) as exc_info: + unpackb(packed) + err = exc_info.value + assert err.unpacked == 42 + assert err.extra == packb("trailing") + + +def test_unpack_raises_extra_data_on_stream_with_trailing_bytes(): + stream = BytesIO(packb(100) + packb(200)) + with raises(ExtraData) as exc_info: + unpack(stream) + assert exc_info.value.unpacked == 100 + assert exc_info.value.extra == packb(200)