aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pyasn1/codec/ber/decoder.py5
-rw-r--r--tests/codec/ber/test_decoder.py12
2 files changed, 16 insertions, 1 deletions
diff --git a/pyasn1/codec/ber/decoder.py b/pyasn1/codec/ber/decoder.py
index 456934e..08fe0f3 100644
--- a/pyasn1/codec/ber/decoder.py
+++ b/pyasn1/codec/ber/decoder.py
@@ -503,7 +503,9 @@ class UniversalConstructedTypeDecoder(AbstractConstructedDecoder):
namedTypes = asn1Object.componentType
- if not namedTypes or namedTypes.hasOptionalOrDefault:
+ if (namedTypes.hasOptionalOrDefault or
+ asn1Object.typeId == univ.Set.typeId or
+ not namedTypes):
seenIndices = set()
idx = 0
while substrate:
@@ -1083,6 +1085,7 @@ class Decoder(object):
if logger:
logger('codec %s yields type %s, value:\n%s\n...remaining substrate is: %s' % (concreteDecoder.__class__.__name__, value.__class__.__name__, value.prettyPrint(), substrate and debug.hexdump(substrate) or '<none>'))
state = stStop
+ break
if state is stTryAsExplicitTag:
if tagSet and tagSet[0].tagFormat == tag.tagFormatConstructed and tagSet[0].tagClass != tag.tagClassUniversal:
# Assume explicit tagging
diff --git a/tests/codec/ber/test_decoder.py b/tests/codec/ber/test_decoder.py
index 2f61acd..a836250 100644
--- a/tests/codec/ber/test_decoder.py
+++ b/tests/codec/ber/test_decoder.py
@@ -957,12 +957,24 @@ class GuidedSetDecoderTestCase(unittest.TestCase):
ints2octs((49, 18, 5, 0, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 2, 1, 1)), asn1Spec=self.s
) == (self.s, null)
+ def testWithOptionalAndDefaultedDefModeReordered(self):
+ self.__initWithOptionalAndDefaulted()
+ assert decoder.decode(
+ ints2octs((49, 18, 2, 1, 1, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 5, 0)), asn1Spec=self.s
+ ) == (self.s, null)
+
def testWithOptionalAndDefaultedIndefMode(self):
self.__initWithOptionalAndDefaulted()
assert decoder.decode(
ints2octs((49, 128, 5, 0, 36, 128, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 0, 0, 2, 1, 1, 0, 0)), asn1Spec=self.s
) == (self.s, null)
+ def testWithOptionalAndDefaultedIndefModeReordered(self):
+ self.__initWithOptionalAndDefaulted()
+ assert decoder.decode(
+ ints2octs((49, 128, 2, 1, 1, 5, 0, 36, 128, 4, 11, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 0, 0, 0, 0)), asn1Spec=self.s
+ ) == (self.s, null)
+
def testWithOptionalAndDefaultedDefModeChunked(self):
self.__initWithOptionalAndDefaulted()
assert decoder.decode(