diff options
author | Ilya Etingof <etingof@gmail.com> | 2017-07-07 10:03:44 +0200 |
---|---|---|
committer | Ilya Etingof <etingof@gmail.com> | 2017-09-10 14:16:26 +0200 |
commit | 7483bbfebf55a8dd3c74e3af93311b759186991c (patch) | |
tree | e6c8fa4ca0598770e887feaa68670c18ad16f7a7 | |
parent | 63f92c7c995752a7418aa6a168c4e48524acc127 (diff) | |
download | pyasn1-git-7483bbfebf55a8dd3c74e3af93311b759186991c.tar.gz |
run hole type substitution only when components are in place
-rw-r--r-- | pyasn1/codec/ber/decoder.py | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/pyasn1/codec/ber/decoder.py b/pyasn1/codec/ber/decoder.py index 306f4b4..c080b96 100644 --- a/pyasn1/codec/ber/decoder.py +++ b/pyasn1/codec/ber/decoder.py @@ -529,18 +529,19 @@ class UniversalConstructedTypeDecoder(AbstractConstructedDecoder): ) idx += 1 - for holeName, governingName, typesMap in namedTypes.holes: - holeComponent = asn1Object[holeName] - if holeComponent.isValue: - governingComponent = asn1Object[governingName] - if governingComponent in typesMap: - component, rest = decodeFun( - holeComponent.asOctets(), - asn1Spec=typesMap[governingComponent] - ) + if namedTypes: + for holeName, governingName, typesMap in namedTypes.holes: + holeComponent = asn1Object[holeName] + if holeComponent.isValue: + governingComponent = asn1Object[governingName] + if governingComponent in typesMap: + component, rest = decodeFun( + holeComponent.asOctets(), + asn1Spec=typesMap[governingComponent] + ) asn1Object.setComponentByName(holeName, component, matchTags=False, matchConstraints=False) - if not namedTypes: + else: asn1Object.verifySizeSpec() return asn1Object, tail @@ -643,6 +644,20 @@ class UniversalConstructedTypeDecoder(AbstractConstructedDecoder): raise error.SubstrateUnderrunError( 'No EOO seen before substrate ends' ) + + if namedTypes: + for holeName, governingName, typesMap in namedTypes.holes: + holeComponent = asn1Object[holeName] + if holeComponent.isValue: + governingComponent = asn1Object[governingName] + if governingComponent in typesMap: + component, rest = decodeFun( + holeComponent.asOctets(), + asn1Spec=typesMap[governingComponent] + ) + asn1Object.setComponentByName(holeName, component, matchTags=False, matchConstraints=False) + + else: asn1Object.verifySizeSpec() return asn1Object, substrate |