diff --git a/idna/core.py b/idna/core.py index 0dae61a..69b66ef 100644 --- a/idna/core.py +++ b/idna/core.py @@ -240,8 +240,12 @@ def check_label(label: Union[str, bytes, bytearray]) -> None: if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): continue elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): - if not valid_contextj(label, pos): - raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {} at position {} in {}'.format( _unot(cp_value), pos+1, repr(label))) elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): if not valid_contexto(label, pos): diff --git a/tests/test_idna.py b/tests/test_idna.py index 81afb32..0641eeb 100755 --- a/tests/test_idna.py +++ b/tests/test_idna.py @@ -270,6 +270,7 @@ def test_decode(self, decode=None, skip_str=False): self.assertRaises(idna.IDNAError, decode, b'xn--') self.assertRaises(idna.IDNAError, decode, b'\x8d\xd2') self.assertRaises(idna.IDNAError, decode, b'A.A.0.a.a.A.0.a.A.A.0.a.A.0A.2.a.A.A.0.a.A.0.A.a.A0.a.a.A.0.a.fB.A.A.a.A.A.B.A.A.a.A.A.B.A.A.a.A.A.0.a.A.a.a.A.A.0.a.A.0.A.a.A0.a.a.A.0.a.fB.A.A.a.A.A.B.0A.A.a.A.A.B.A.A.a.A.A.a.A.A.B.A.A.a.A.0.a.B.A.A.a.A.B.A.a.A.A.5.a.A.0.a.Ba.A.B.A.A.a.A.0.a.Xn--B.A.A.A.a') + self.assertRaises(idna.IDNAError, decode, b'xn--ukba655qaaaa14431eeaaba.c') if __name__ == '__main__': unittest.main()