From 3b2dbeb75816c2926c04b8e37b133335b419c138 Mon Sep 17 00:00:00 2001 From: Kio Smallwood Date: Thu, 22 Jul 2021 16:28:00 +0100 Subject: [PATCH] Roll in a fix for #118 while we're at it --- cbor2/decoder.py | 6 +++++- source/decoder.c | 4 +++- tests/test_decoder.py | 10 ++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/cbor2/decoder.py b/cbor2/decoder.py index 876e4cfc..82e95b2c 100644 --- a/cbor2/decoder.py +++ b/cbor2/decoder.py @@ -369,7 +369,11 @@ def decode_special(self, subtype): return CBORSimpleValue(subtype) # Major tag 7 - return special_decoders[subtype](self) + try: + return special_decoders[subtype](self) + except KeyError as e: + raise CBORDecodeValueError( + "Undefined Reserved major type 7 subtype 0x%x" % subtype) from e # # Semantic decoders (major tag 6) diff --git a/source/decoder.c b/source/decoder.c index 7f0af3c2..4a0c4423 100644 --- a/source/decoder.c +++ b/source/decoder.c @@ -1606,7 +1606,9 @@ decode_special(CBORDecoderObject *self, uint8_t subtype) case 27: return CBORDecoder_decode_float64(self); case 31: CBOR2_RETURN_BREAK; default: - // XXX Raise exception? + PyErr_Format( + _CBOR2_CBORDecodeValueError, + "Undefined Reserved major type 7 subtype 0x%x", subtype); break; } } diff --git a/tests/test_decoder.py b/tests/test_decoder.py index ce8ce049..3ec0f308 100644 --- a/tests/test_decoder.py +++ b/tests/test_decoder.py @@ -697,3 +697,13 @@ def test_invalid_cbor(impl): '4c271579b01633a3ef6271be5c225eb2' ) ) + + +@pytest.mark.parametrize('data, expected', [ + ('fc', '1c'), ('fd', '1d'), ('fe', '1e') + ], +) +def test_reserved_special_tags(impl, data, expected): + with pytest.raises(impl.CBORDecodeValueError) as exc_info: + impl.loads(unhexlify(data)) + assert exc_info.value.args[0] == "Undefined Reserved major type 7 subtype 0x" + expected