summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Etingof <etingof@gmail.com>2017-07-07 10:03:44 +0200
committerIlya Etingof <etingof@gmail.com>2017-09-10 14:16:26 +0200
commit7483bbfebf55a8dd3c74e3af93311b759186991c (patch)
treee6c8fa4ca0598770e887feaa68670c18ad16f7a7
parent63f92c7c995752a7418aa6a168c4e48524acc127 (diff)
downloadpyasn1-git-7483bbfebf55a8dd3c74e3af93311b759186991c.tar.gz
run hole type substitution only when components are in place
-rw-r--r--pyasn1/codec/ber/decoder.py35
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